取消 AsyncTask 时未显示警报对话框



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

但是,如果我取消 AsyncTask,则不会显示警报对话框,我还注意到没有调用onCancelled(),但onPostExecute()仍在执行。

如果有人可以帮忙?

编辑:如果我使用 while 方法,将显示警报对话框,但我如何正确取消 AsyncTask,因为截至 try 年的代码仍在执行doInBackground()

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

编辑2:解决了!似乎 AsyncTask 调用没有正确直觉,下面的代码有效,现在也调用onCancel 方法,并且 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
        }
    }

我可能是错的,但我似乎不明白每次在 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
        }
    }
}

最新更新