Завершите вызов, когда AsyncTask завершит - PullRequest
12 голосов
/ 24 декабря 2011

Моя деятельность по вызову:

public class Hello extends Activity {  

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

Now In MyTask (внешний класс):

public class MyTask extends AsyncTask<Void, Void, Void> {
private Context mContext;

public MyTask(Context context) {

    mContext = context;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mContext.finish();

}

Если я уберу mContext.finish() и выше, другие вещи будут работать как положено.
Но если я звоню mContext.finish(), я получаю сообщение об ошибке: The method finish() is undefined for the type Context (Eclipse не показывает finish (), когда я пишу mContext., Что говорит о том, что я неправильно использую finish ().)

Что мне нужно сделать, чтобы завершить вызов Hello после того, как MyTask завершит задачу

Ответы [ 6 ]

20 голосов
/ 24 декабря 2011
((Activity)mContext).finish();

Правильный способ привести Context к Activity и вызвать его метод finish().Не уверен, почему вы хотите закончить Activity из AsyncTask хотя

16 голосов
/ 24 декабря 2011

То, что вы можете попытаться сделать вместо вызова context.finish (), почему бы вам не сделать интерфейс обратного вызова, подобный этому:

public interface TaskCallback{
void done();
}

Затем вы реализуете это в своей деятельности

public Hello extends Activity implements TaskCallback{

    .....BUNCH OF ACTIVITY CODE.....

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

public void done() {
     finish();
}

}

И вместо контекста в качестве параметра у вас есть TaskCallback

public class MyTask extends AsyncTask<Void, Void, Void> {
private TaskCallback mCallback;

public MyTask(TaskCallback callback) {

    mCallback = callback;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mCallback.done();

}

Итак, это дает вам больше гибкости для настройки каждой реализации.

3 голосов
/ 06 июня 2015

У меня такая же ситуация, затем я делаю следующее:

public class MyTask extends AsyncTask<Void, Void, Void> {
private Activity mActivity;
private Context mContext;

public MyTask(Activity activity) {
    mActivity = activity;
    mContext = mActivity.getApplicationContext();
}  

//doinbackground, etc

protected void onPostExecute() {
    mActivity.finish();

}

Надеюсь, это поможет:)

2 голосов
/ 26 августа 2013

Определите метод в вашем классе деятельности следующим образом:

public void FinishAfterAsyncTask()
{
   this.finish();
}

И вызовите этот метод из OnPostExecute метода AsynTask класса.

1 голос
/ 12 марта 2012

Вы можете создать новый приватный AsyncTask, расширенный от вашего публичного.

В этом закрытом AsyncTask у вас есть доступ к компоненту Activity, и вы можете переопределить метод onPostExecute, чтобы завершить его.

Ваш действительно AsyncTask

public class MyPublicAsyncTask extends AsyncTask<Void, Void, Void> {
    Context context;
    public GetHorariosAsyncTask(Context ctx){
        context = ctx;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // prepare yourself for an async work
    }
    @Override
    protected Void doInBackground(Void... params) {
        // Do yout cool async stuff
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
       // you're finish, let's tell to user
    }
}

Ваша деятельность с частной AsyncTask

public class MyActivity  extends Activity {
    Activity mAct;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mAct = this;
    }

    private class MyPrivateAsyncTask extends MyPublicAsyncTask {

        public MyPrivateAsyncTask(Context ctx) {
            super(ctx);
            // TODO Auto-generated constructor stub
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            // our async task is completed! let's take care of this activity
            mAct.finish();
        }

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

Можете ли вы попробовать

this.finish()

Похоже, из-за вызова с использованием mContext, что говорит неопределенный.

...