web-dev-qa-db-ja.com

AsyncTaskが完了したら、呼び出しアクティビティを終了します

私の呼び出し活動:

_public class Hello extends Activity {  

public void onCreate(Bundle savedInstanceState) {

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

現在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(mContextを記述したときにEclipseはfinish()を表示しません。 finish()を間違って使用しています。)

Helloがタスクを完了した後、呼び出しアクティビティMyTaskを終了するには何をする必要がありますか

13
Atul Goyal
_((Activity)mContext).finish();
_

ContextActivityにキャストし、そのfinish()メソッドを呼び出す正しい方法です。 ActivityからAsyncTaskを終了したい理由がわかりませんが

20
Squonk

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();
}

}

そして、パラメータとしてContextを持つ代わりに、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();

}

これで、各実装をカスタマイズするための柔軟性が高まります。

18
Necronet

私は同じ状況になりました、そして私は次のようにします:

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();

}

お役に立てば幸いです:)

3
desu sudarsana

次のように、アクティビティクラスでメソッドを定義します。

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

そして、このメソッドをOnPostExecuteクラスのAsynTaskメソッドから呼び出します。

2
Neeraj

パブリックAsyncTaskから拡張された新しいプライベート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();
        }

    }
}
1
rubdottocom