Как убедиться, что все операторы выполнены? - PullRequest
0 голосов
/ 13 декабря 2011

как убедиться, что поток в методе doInBackground () завершен или нет?Я хочу завершить поток, который я начал в методе doInBackground () до вызова postExecute.

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 голосов
/ 13 декабря 2011

Проблема в том, что вы создаете новый поток изнутри 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 ().

0 голосов
/ 13 декабря 2011

AsyncTask автоматически создает собственный поток, вам не нужно делать это вручную.
При запуске AsyncTask происходит следующее:

  1. onPreExecute() вызывается из потока, создавшего AsyncTask.
  2. doInBackground() выполняется в отдельном потоке.
  3. onPostExecute() вызывается и запускается в исходном потоке, когда doInBackground() есть завершено.

То, что вы хотите сделать, - это поместить свой тяжелый расчет / загрузку / что угодно непосредственно в метод doInBackground(), а затем завершить все в onPostExectute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...