如何确保所有语句都被执行?

时间:2011-12-13 08:25:08

标签: 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 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");
    }

    }
}

我想确保线程只能在doInBackground方法中完成。

2 个答案:

答案 0 :(得分:0)

AsyncTask自动创建自己的线程,您无需手动执行此操作 启动AsyncTask时会发生以下情况:

    从创建AsyncTask的线程调用
  1. onPreExecute()
  2. doInBackground()在单独的线程上执行。
  3. onPostExecute()被调用并在原始线程上运行时 doInBackground()是     完成。
  4. 所以你要做的就是在doInBackground()方法中直接进行繁重的计算/加载/任何事情,然后完成onPostExectute()中的事情。

答案 1 :(得分:0)

问题是您正在从doInbackground()内部创建一个新线程。

不要这样做,一般情况下,不要混合使用Thread和AsyncTask。将您的代码更改为

   @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

                for (int i = 0; i < 200; i++) {                     
                    Log.e(TAG, ""+i);                       
                }
        return null;
    }

这将确保在调用onPostExecute()之前doInBackground()中的所有代码都已完成。