在doInBackground()之后,onPostExecute()不会执行

时间:2013-04-24 10:06:30

标签: android android-asynctask

我有这段代码

public class AsyncClassTest extends Activity {

String strMessage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    new MyClass().execute();

    Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG)
            .show();

}

public class MyClass extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        return "Hello world!!!";
    }

    @Override
    protected void onPostExecute(String result) {
        strMessage = result;
    }
}

}

并且在运行时,在new MyClass().execute();之后它显示strMessage为空并且在显示toast代码后进入onPostExecute()方法,如何运行此代码并在{之后显示消息{1}}

6 个答案:

答案 0 :(得分:1)

Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG)
    .show();

将其从onCreate移除,并将其写入onPostExecute

在您的AsyncTask开始行动之前执行Toast的代码中,请始终记住AsyncTask是后台thread

答案 1 :(得分:1)

public class AsyncClassTest extends Activity {

String strMessage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new MyClass().execute();

}

public class MyClass extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... arg0) {
        return "Hello world!!!";
    }

    @Override
    protected void onPostExecute(String result) {
        strMessage = result;
        Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG).show();
    }

}
}

答案 2 :(得分:0)

您要在AsyncTask中设置字符串的值。当你调用execute()时,它将异步运行(一个单独的线程),并且很可能在设置字符串的值之前显示Toast。

基本上,execute()不会“等待”onPostExecute被调用。它产生一个单独的线程,你的onCreate()方法继续显示具有旧值的Toast。

尝试将Toast.makeText移至onPostExecute命令以查看其是否有效。

另外,如果你真的希望onPostExecute在你转移到Toast之前完成执行。你真的不应该使用AsyncTask

答案 3 :(得分:0)

@Override
    protected void onPostExecute(String result) {
        strMessage = result;

 Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG)
            .show();

    }

onPostExecute(Result),在后台计算完成后在UI线程上调用。背景计算的结果作为参数

传递给该步骤

答案 4 :(得分:0)

顾名思义,AsyncTask是异步运行的东西,所以你不能只execute()它并期望它在下一行代码被调用之前返回。所以你应该在Toast里面创建onPostExecute()(或者在onPostExecute()中调用的方法里面),就像调用onPostExecute()时你知道任务有结束。

答案 5 :(得分:0)

顾名思义,

AsyncTask是异步的。这意味着它不必在下一行之前执行

如果您在任务完成后有操作,则必须在onPostExecute

中完成或启动