Android 如何确保执行所有语句?

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

如何确保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 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中创建了自己的线程。是的,这也是一个解决方案。谢谢