0

我正在尝试使用onBackPressed所以用户可以取消 asynctask 操作。但是当您按下设备上的后退按钮时,它不会执行任何操作。我的 asynctask 仍在运行,我的进度对话框仍然显示。有人可以帮助我并帮助我找出问题所在。

public class ListView extends ListActivity {    


    ArrayList<HashMap<String, String>> questionList;        

     final String TAG_RESULTS = "results";
     final String TAG_QUESTION_SUBJECT = "Subject";
     final String TAG_QUESTION_NUMANSWERS = "NumAnswers";
     final String TAG_QUESTION = "question";
     final String TAG_QUESTION_CONTENT = "Content";
     final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer";
     final String TAG_ANSWERS = "Answers";
     final String TAG_ANSWER = "Answer";    
     final String TAG_ANSWERS_CONTENT = "content";      
     final String TAG_QUERY = "query";
     ProgressDialog pDialog;
     LoadAllData mTask; 

            JSONArray question = null;          
            android.widget.ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        //setContentView(R.layout.listview);        

    questionList = new ArrayList<HashMap<String, String>>(); 

    mTask = new LoadAllData();

         mTask.execute();

        }


    @Override   
    protected void onListItemClick(android.widget.ListView l, View v, int pos, long id) {
         super.onListItemClick(l, v, pos, id);  

          HashMap<String, String> item = questionList.get(pos);

          Intent i = new Intent(ListView.this, SingleListItem.class);
          i.putExtra(TAG_QUESTION_SUBJECT, item.get(TAG_QUESTION_SUBJECT));
          i.putExtra(TAG_QUESTION_CONTENT, item.get(TAG_QUESTION_CONTENT));
          i.putExtra(TAG_QUESTION_CHOSENANSWER, item.get(TAG_QUESTION_CHOSENANSWER));
          startActivity(i);

            }     

    @Override
    public void onBackPressed() 
    {              
        /** If user Pressed BackButton While Running Asynctask
            this will close the ASynctask.
         */
        if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
        {
            mTask.cancel(true);
        }          
        super.onBackPressed();
    }


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub


    /** If Activity is Destroyed While Running Asynctask
            this will close the ASynctask.   */

     if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
     {
        mTask.cancel(true);
      }  

        super.onDestroy();

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub


     if (pDialog != null)
     {
         if(pDialog.isShowing())
         {
             pDialog.dismiss();
         }
            super.onPause();

      }  

    }

    class LoadAllData extends AsyncTask<String, String, String> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();             
            pDialog = new ProgressDialog(ListView.this);
            pDialog.setMessage("Loading Data. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected String doInBackground(String... args) {

            try {
                Intent in = getIntent();
                String searchTerm = in.getStringExtra("TAG_SEARCH");
                String query = URLEncoder.encode(searchTerm, "utf-8");
                String URL = "http://rxample.com";
                JSONParsser jParser = new JSONParsser();
                JSONObject json = jParser.readJSONFeed(URL);
                try {

                    JSONArray questions = json.getJSONObject("all").getJSONArray("questions");

                    for(int i = 0; i < questions.length(); i++) {
                        JSONObject question = questions.getJSONObject(i);


                    String Subject = question.getString(TAG_QUESTION_SUBJECT);
                    String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
                    String Content = question.getString(TAG_QUESTION_CONTENT);

                    //JSONArray Answers = question.getJSONObject(TAG_ANSWERS).getJSONArray(TAG_ANSWER);


                    //JSONObject Answer = Answers.getJSONObject(0);

                    //String Content = Answer.getString(TAG_ANSWERS_CONTENT);

                               HashMap<String, String> map = new HashMap<String, String>();

                               map.put(TAG_QUESTION_SUBJECT, Subject);
                               map.put(TAG_QUESTION_CONTENT, Content);
                               map.put(TAG_QUESTION_CHOSENANSWER, ChosenAnswer);

                               questionList.add(map);

                    }


                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

                return TAG_QUESTION ;           

        }

        @Override
        protected void onPostExecute(String file_URL) {
            if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
            ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
                        R.layout.listelements,
                        new String[] { TAG_QUESTION_SUBJECT }, new int[] {
                        R.id.Subject,});

                setListAdapter(adapter);                

        }       
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }   
}
4

3 回答 3

1

我认为你的 ProgressDialog 工作中存在这个问题。它在前面工作时捕捉到后退按钮单击。你不能因为pDialog.setCancelable(false);

将可取消更改为pDialog.setCancelable(true)并设置OnCancelListener,当对话框被取消时将调用它。

于 2013-08-27T20:44:09.177 回答
0

当您取消 时AsyncTask,它会设置取消标志。在doInBackground()函数中,您需要检查isCancelled()是否cancel()已被调用。onPostExecute()任务取消时也不会调用。而是实施onCancelled(Object)以清理您需要的任何东西。

class LoadAllData extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();             
        pDialog = new ProgressDialog(ListView.this);
        pDialog.setMessage("Loading Data. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected String doInBackground(String... args) {

        try {
            Intent in = getIntent();
            String searchTerm = in.getStringExtra("TAG_SEARCH");
            String query = URLEncoder.encode(searchTerm, "utf-8");
            String URL = "http://rxample.com";
            JSONParsser jParser = new JSONParsser();
            JSONObject json = jParser.readJSONFeed(URL);
            try {

                JSONArray questions = json.getJSONObject("all").getJSONArray("questions");
                //Stop looping on cancel
                for(int i = 0; i < questions.length()&&!isCancelled(); i++) {
                    JSONObject question = questions.getJSONObject(i);


                    String Subject = question.getString(TAG_QUESTION_SUBJECT);
                    String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
                    String Content = question.getString(TAG_QUESTION_CONTENT);

                    //JSONArray Answers = question.getJSONObject(TAG_ANSWERS).getJSONArray(TAG_ANSWER);


                    //JSONObject Answer = Answers.getJSONObject(0);

                    //String Content = Answer.getString(TAG_ANSWERS_CONTENT);

                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put(TAG_QUESTION_SUBJECT, Subject);
                    map.put(TAG_QUESTION_CONTENT, Content);
                    map.put(TAG_QUESTION_CHOSENANSWER, ChosenAnswer);

                    questionList.add(map);

                }


            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return TAG_QUESTION ;           

    }

    @Override
    protected void onPostExecute(String file_URL) {
        if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
        ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
                    R.layout.listelements,
                    new String[] { TAG_QUESTION_SUBJECT }, new int[] {
                    R.id.Subject,});

        setListAdapter(adapter);                

    }       

    @Override
    protected void onCancelled(String result) {
        //Clean up
        if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
        ...
    }
}
于 2013-08-27T20:44:09.177 回答
0

AsyncTask cancel() 不会终止您的异步任务。它只是设置了一个布尔标志,因此任务对象上的 isCancelled() 返回 true,这样您就可以摆脱长期运行的 doInBackground。我相信一切都按您上面的代码的预期工作。如果任务被取消 onPostExecute 将不会运行,因此您的进度对话框不会被关闭。它会调用 onCancelled() 代替。

于 2013-08-27T20:47:34.847 回答