Android 如何确保执行所有语句?
如何确保doInBackground()方法中的线程是否已完成? 我想在调用postExecute之前完成在doInBackground()方法中启动的线程Android 如何确保执行所有语句?,android,android-asynctask,Android,Android Asynctask,如何确保doInBackground()方法中的线程是否已完成? 我想在调用postExecute之前完成在doInBackground()方法中启动的线程 package com.application.test; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; public class MyActivity extend
package com.application.test;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new MyTask().execute(null);
}
private class MyTask extends AsyncTask<Void, Void, Void>
{
protected static final String TAG = "Async";
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 200; i++) {
Log.e(TAG, ""+i);
}
}
}).start();
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.e(TAG, "Post execute");
}
}
}
package com.application.test;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
公共类MyActivity扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new MyTask().execute(空);
}
私有类MyTask扩展了AsyncTask
{
受保护的静态最终字符串TAG=“Async”;
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
新线程(newrunnable()){
@凌驾
公开募捐{
//TODO自动生成的方法存根
对于(inti=0;i<200;i++){
日志e(标签““+i”);
}
}
}).start();
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Log.e(标记“执行后”);
}
}
}
我想确保线程只能在doInBackground方法中完成。自动创建自己的线程,您不需要手动执行。启动异步任务时,会发生以下情况:
onPreExecute()
doInBackground()
在单独的线程上执行李>
onPostExecute()
doInBackground()
完成因此,您要做的是将繁重的计算/加载/任何内容直接放在
doInBackground()
方法中,然后在onpostExecute()
中完成任务。问题是您正在从doInBackground()内部创建一个新线程
不要这样做,一般来说,不要混合线程和异步任务。将代码更改为
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
for (int i = 0; i < 200; i++) {
Log.e(TAG, ""+i);
}
return null;
}
@覆盖
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
对于(inti=0;i<200;i++){
日志e(标签““+i”);
}
返回null;
}
这将确保在调用onPostExecute()之前,doInBackground()中的所有代码都已完成。请描述您的问题,以便更容易理解。如果您使用的是AsyncTask,那么onPostExecute()方法就在那里。我只想在doInBackground方法中完成线程。onPostExecute不向您保证在doInBackground()方法中执行的线程。如果他在doInBackground中创建了一个新线程(如示例中所示),则不能保证。无论如何,你应该稍微提高你的回答率。我在doInBackground()中创建了一个新线程,你可以观察眼睛,但你不应该。AsyncTask会自动处理该任务。No。它在你的情况下不起作用,因为你在doInBackground中创建了自己的线程。是的,这也是一个解决方案。谢谢