【问题标题】:AlertDialog not showing while cancelling AsyncTask取消 AsyncTask 时不显示 AlertDialog
【发布时间】:2016-01-17 02:25:53
【问题描述】:

我在取消 AsyncTask 时遇到了一个小问题,它位于处理一些数据的片段中。如果 Internet 会话过期,AsyncTask 应被取消并显示一个对话框以通知用户。

但是,如果我取消 AsyncTask,AlertDialog 将显示,我还注意到 onCancelled()is 被调用,但 onPostExecute() 仍在执行。

如果有人可以帮忙?

编辑:如果我使用 while 方法,会显示 AlertDialog,但如何正确取消 AsyncTask,因为 tryin doInBackground() 的代码仍在执行中? p>

while (!isCancelled()) {
// Do stuff
}

编辑 2: 已解决!似乎 AsyncTask 调用没有正确启动,下面的代码可以正常工作,现在 onCancelled 方法 也被 调用 并且 onPostExecute 应该被拒绝。 感谢 Anudeep Bulla 为我指明了正确的方向。

public class Tb3_Abonnement extends Fragment {

    private AsyncTask<Void, Void, Void> task;
...
@Override // If Fragment is visible to user, start asynctask
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser) {
                // execute AsyncTask
                startFetch();
        }
    }
// Wrap (asynctask call) in a own method
public void startFetch() { 
        task = new FetchFacturen();
        task.execute();
    }

private class FetchFacturen extends AsyncTask<Void, Void, Void> {
// Create new AlertDialog
        AlertDialog taskDialog = new AlertDialog.Builder(getActivity())
                .setCancelable(false)
                .setTitle("Mededeling Facturen:")
                .setMessage("Uw sessie is verlopen! U dient zich weer opnieuw in te loggen. ")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // Start LoginActivity
                        Intent mainIntent = new Intent(getActivity(), LoginActivity.class);
                        getActivity().startActivity(mainIntent);
                        getActivity().finish();
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_info)
                .create();

        @Override
        protected void onPreExecute() {
            if (Helper.minutes <= 0) {
                task.cancel(true);
            } else {
                showProgress(true);
            }
        }

        @Override
        protected Void doInBackground(Void... result) {
            CharSequence cs1 = "€";
            if (isCancelled()) {
                util.disconnect();
                return null;
            }
                try {
                    // The heavy stuff
                        }

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            return null;
        }

        @Override
        protected void onCancelled() { //  Correctly called
            if(isCancelled()){
                Log.e("CANCELLED", "TAB3");
                this.taskDialog.show(); 
            }
            super.onCancelled();
        }

        @Override
        protected void onPostExecute(Void result) { // Skipped
            if(isCancelled()){
                this.taskDialog.show();
            } else {
                setupInvoiceAdapter();
                showProgress(false);
            }
        }
    }

以下是重要的代码部分:

public class Tb3_Abonnement extends Fragment {

private FetchAbbo task;
...
@Override // If Fragment is visible to user, start asynctask
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser) {
                // execute AsyncTask
                task = new FetchAbbo();
                task.execute();
        }

public class FetchAbbo extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            if (Helper.minutes <= 0) {
                task.cancel(true); // Cancel AsyncTask
                new AlertDialog.Builder(getActivity()) // Create new AlertDialog
                        .setCancelable(false)
                        .setTitle("Mededeling:")
                        .setMessage("Uw sessie is verlopen! U dient zich weer opnieuw in te loggen. ")
                        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                // Start LoginActivity
                            }
                        })
                        .setIcon(android.R.drawable.ic_dialog_info)
                        .show();
            }
        }

        @Override
        protected Void doInBackground(Void... result) {
                if (!this.isCancelled()) { // Executed 
                    Log.e("FetchAbbo: ", "Cancelled!"); // Printed
                    util.disconnect();
                    return null;
                }
                try {
                    Log.e("FetchAbbo: ", "still running!"); 
                    // Do the heavy stuff
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

            return null;
        }

        @Override
        protected void onCancelled() {
            Log.e("CANCELLED", "TAB3"); // Not printed, onCancelled() not called?
            super.onCancelled();
        }

        @Override
        protected void onPostExecute(Void result) {
            setupTxtViews();
            mScrollView.setVisibility(View.VISIBLE); // Set ScrollView visible

        }
    }

【问题讨论】:

  • 你在哪个版本上测试它。?
  • @sourabh bans,Api 23 (marshmellow) 如果你是这个意思。
  • 是你的设备版本吗。
  • 是的。我正在运行最新的 marshmellow 的 Nexus 9 平板电脑上进行测试。
  • 好的..看到这个..stackoverflow.com/a/16303136/3790052

标签: android android-asynctask android-alertdialog


【解决方案1】:

我可能错了,但我似乎不明白每次在 onPreExecute 中显示对话框的逻辑。为什么不试试这个?

public class FetchAbbo extends AsyncTask<Void, Void, Void> {
    AlertDialog taskDialog = new AlertDialog.Builder(getActivity()) // Create new AlertDialog
                                            .setCancelable(false)
                                            .setTitle("Mededeling:")
                                            .setMessage("Uw sessie is verlopen! U dient zich weer opnieuw in te loggen. ")
                                            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                                                  public void onClick(DialogInterface dialog, int which) {
                                                       // Start LoginActivity
                                                  }
                                            })
                                           .setIcon(android.R.drawable.ic_dialog_info)
                                           .create();
    @Override
    protected void onPreExecute() {
        if (Helper.minutes <= 0) {
            task.cancel(true); // Cancel AsyncTask

        }
    }

    @Override
    protected Void doInBackground(Void... result) {
            if (!this.isCancelled()) { // Executed 
                Log.e("FetchAbbo: ", "Cancelled!"); // Printed
                util.disconnect();
                return null;
            }
            try {
                Log.e("FetchAbbo: ", "still running!"); 
                // Do the heavy stuff
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        return null;
    }

    @Override
    protected void onCancelled() {
        Log.e("CANCELLED", "TAB3"); // Not printed, onCancelled() not called?
        if(this.isCancelled()){
            this.taskDialog.show();
        }
        super.onCancelled();
    }

    @Override
    protected void onPostExecute(Void result) {
        if(this.isCancelled()){
            this.taskDialog.show();
        } else {
            setupTxtViews();
            mScrollView.setVisibility(View.VISIBLE); // Set ScrollView visible
        }

    }
}

【讨论】:

  • 感谢您展示了正确的方式。如前所述,在 onPostExecute 中将 if(this.isCancelled()) 更改为 if(!this.isCancelled())。完成工作。
  • 嗯,您不希望仅在您的任务被取消时才显示对话框吗?
  • 它应该显示互联网会话是否已过期,然后自动取消 AsyncTask。
  • 那么它应该是this.isCancelled 本身。也许取消不起作用。您可以尝试使用task.isCancelled 而不是this.isCancelled 吗?
  • 嗯,是的,有些东西不正常,突然它立即取消了 AsyncTask,它似乎不再检查 (Helper.minutes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多