0

我有这个代码

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为 null 并且在显示 toast 代码进入onPostExecute()方法之后,如何使此代码运行并在之后显示消息new MyClass().execute();

4

6 回答 6

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();
    }

}
}
于 2013-04-24T10:15:05.373 回答
1
Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG)
    .show();

将其删除onCreate并写入onPostExecute

在你的代码中,Toast 在你AsyncTask进入 Action 之前执行,永远记住那AsyncTask是一个背景thread

于 2013-04-24T10:12:31.573 回答
0

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

如果任务完成有操作要做,必须在onPostExecute

于 2013-04-24T10:15:50.773 回答
0

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

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

尝试将其移动Toast.makeTextonPostExecute命令中以查看它的工作。

此外,如果您真的想onPostExecute在继续执行 Toast 之前完成执行。你真的不应该AsyncTask为此使用。

于 2013-04-24T10:11:26.593 回答
0
@Override
    protected void onPostExecute(String result) {
        strMessage = result;

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

    }

onPostExecute(Result),在后台计算完成后在 UI 线程上调用。后台计算的结果作为参数传递给这一步

于 2013-04-24T10:11:43.370 回答
0

顾名思义,AsyncTask它是异步运行的,所以你不能只execute()期望它在下一行代码被调用之前返回。因此,您应该创建Toast内部onPostExecute()(或在被调用的方法内部onPostExecute()),因为当onPostExecute()被调用时,您肯定知道任务已经完成。

于 2013-04-24T10:12:25.833 回答