【问题标题】:How to make sure all statements are executed?如何确保所有语句都被执行?
【发布时间】:2011-12-13 18:01:27
【问题描述】:

如何确保 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 方法中完成。

【问题讨论】:

  • 请描述您的问题,以便更容易理解。如果您使用的是 AsyncTask,那么 onPostExecute() 方法就在那里。
  • 我只想完成 doInBackground 方法中的线程。onPostExecute 不向您保证 doInBackground() 方法中正在执行的线程。
  • 如果他像示例中那样在 doInBackground 中创建一个新线程,则不会。无论如何,你应该提高你的答题率。
  • 我在 doInBackground() 中新建了一个线程,你可以观察
  • 是的,你不应该这样做。 AsyncTask 会自动处理。

标签: android android-asynctask


【解决方案1】:

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

  1. onPreExecute() 从创建 AsyncTask 的线程中调用。
  2. doInBackground() 在单独的线程上执行。
  3. onPostExecute() 被调用并在原始线程上运行时 doInBackground() 是 完成。

所以你要做的就是把你繁重的计算/加载/任何东西直接放在doInBackground()方法中,然后在onPostExectute()中完成。

【讨论】:

  • 不。它不适用于您的情况,因为您在 doInBackground 中创建了自己的线程。
【解决方案2】:

问题是您正在从 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;
    }

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

【讨论】:

  • 是的,这也是一个解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多