0

在 AsyncTask 完成之前,我无法使用 GUI。我没有认识到在“onCreate”或“onCreateOptionsMenu”方法中发布 execute() 之间有什么区别。你知道出了什么问题吗?谢谢你的帮助。

package com.test11;

import java.util.concurrent.ExecutionException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;

public class TestActitivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_actitivity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_test_actitivity, menu);

        try
        {
            int t = new TestTask().execute().get();
        }

        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        catch (ExecutionException e)
        {
            e.printStackTrace();
        }

        return true;
    }

    class TestTask extends AsyncTask<Void, Void, Integer>
    {
        public Integer doInBackground(Void...voids)
        {
            try
            {
                Thread.sleep(10000);
            }

            catch(Exception e)
            {
                e.printStackTrace();
            }

            return 1;
        }
    }
}
4

2 回答 2

2

你执行你的任务是这样的:

new TestTask().execute().get();

你到底在这里做什么?您创建一个新的任务实例。然后你运行它。然后你调用get()你的任务,它会等到这个任务的计算完成来返回它的值。这意味着onCreate()oronCreateOptionsMenu()被阻塞,直到第二个线程完成。如果您删除get(),您的任务将不会阻止 UI。

如果要使用结果,则应onPostExecute()在 AsyncTask 中覆盖,而不是使用get(). onPostExecute()在 UI 线程中运行,并允许您使用结果轻松操作 UI。例如,如果你想在文本视图中显示你的结果,你可以使用这样的实现:

@Override
public void onPostExecute(Integer result) {
    TextView tv = (TextView) findViewById(R.id.sampletext);
    tv.setText("Result was " + result);
}
于 2012-07-11T08:43:38.940 回答
0

阅读文档get

如有必要,等待计算完成,然后检索其结果。

您几乎不需要在AsyncTask. 只要打电话execute

于 2012-07-11T08:40:46.963 回答