0

アクティビティAを使用してバックグラウンドダウンロードを開始します。AsyncTaskダウンロードが完了AsyncTask.postExecuteすると、ポップアップが表示されAlertDialogます。ただし、ダウンロード中に、別のアクティビティBまたは他のアクティビティに切り替えます。その結果、AlertDialogが表示されなくなります。AlertDialogアクティビティコンテキストを使用します(ここではAである必要があります)。だから、どうすれば私は見せることができAlertDialogますか?

AlertDialog.Builder builder = new  AlertDialog.Builder(context);
builder.setMessage(context.getString(R.string.install));
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        //onSure();
    }
});
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        //onCancle();
    }
});

builder.create().show();
4

2 に答える 2

0

実行できるオプションの 1 つは、フォアグラウンド アクティビティを保持するメンバー変数を持つ、すべてのアクティビティが拡張される BaseActivity を持つことです。AsyncTask が終了したら、BaseActivity からの Activity 参照を使用して AlertDialog を表示できます。例えば:

ファイル: MyBaseActivity.java

public class MyBaseActivity extends Activity {

    protected static Activity sForegroundActivity;

    class MyAsyncTask extends AsyncTask<Object, Object, Object> {

        @Override
        protected Object doInBackground(Object... params) {
            // do stuff
            return null;
        }

        protected void onPostExecute(Object result) {

            // cover the edge case where the AsyncTask finished while we are transitioning 
            // between activities and we have not set the foreground activity instance 
            if(sForegroundActivity == null) {
                return;
            }

            AlertDialog.Builder builder = new AlertDialog.Builder(sForegroundActivity);
            builder.setMessage("Showing Dialog in Foreground Activity");
            builder.setPositiveButton(R.string.ok,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // handle ok clicked
                        }
                    });
            builder.setNegativeButton(R.string.cancel,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // handle cancel clicked
                        }
                    });

            builder.create().show();
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        sForegroundActivity = this;
    }

    @Override
    public void onStop() {
        super.onStop();
        sForegroundActivity = null;
    }
}

ファイル: ActivityA.java

public class ActvityA extends MyBaseActivity {

    private void startAsyncTaskAndGoToActivityB() {

        // start our AsyncTask
        new MyAsyncTask().execute();

        // go to ActivityB.  When the AsyncTask finishes, the AlertDialog will be shown in ActivityB
        Intent myIntent = new Intent(this, ActivityB.class);
        startActivity(myIntent);
    }
}
于 2013-01-10T06:09:17.227 に答える
0

完了する前に完了できない長時間実行タスクの場合は、 IntentServiceActivity Aを使用することをお勧めします。しかし、それはあなたが必要とするものに依存します。これを行うと、バックグラウンドで終了し、. おそらく他のオプションもありますが、私があなたの状況を知っている限り、これが最善のように思えます。それ以外は、次のアクティビティを開始するのを待って、終了したらダイアログのボタンで開始することができます (それがオプションである場合)。UIAsyncTask

于 2013-01-10T03:44:20.187 に答える