我有这段代码
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}}
答案 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