onBackPressed没有采取任何行动

时间:2013-08-27 20:31:21

标签: android

我正在尝试使用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();
    }   
}

3 个答案:

答案 0 :(得分:1)

我认为你的ProgressDialog的工作存在问题。在前面工作时正在捕捉按钮单击。而且你不能因为pDialog.setCancelable(false);

而忽略它

在真实pDialog.setCancelable( true )上更改可取消,并设置OnCancelListener,当对话框被取消时,该{{3}}会被调用。

答案 1 :(得分: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();
        ...
    }
}

答案 2 :(得分:0)

AsyncTask cancel()不会终止您的异步任务。它只是设置一个布尔标志,因此任务对象上的isCancelled()返回true,这样你就可以从长时间运行的doInBackground中拯救出来。我相信一切都按照你上面的代码的预期工作。如果任务被取消onPostExecute将不会运行,因此您的进度对话框不会被解除。它会调用onCancelled()而不是。