2013-08-27 37 views
0

我想使用onBackPressed所以用戶可以取消asynctask操作。但是當您按下設備上的後退按鈕時,它不會執行任何操作。我的asynctask仍然運行,我的進度對話框仍然顯示。有人可以幫助我並幫助我找出問題所在。onBackPressed沒有采取任何行動

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(); 
    } 
} 

回答

1

我認爲你的ProgressDialog的工作問題。在前面工作時捕捉後退按鈕。而且你不能排除,因爲取消的真正pDialog.setCancelable(真正)pDialog.setCancelable(false);

更改設置OnCancelListener時成爲對話框取消,這將被調用。

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(); 
     ... 
    } 
} 
0

AsyncTask cancel()不會終止您的異步任務。它只是設置一個布爾標誌,因此任務對象上的isCancelled()返回true,因此您可以從長時間運行的doInBackground退出。我相信所有的東西都可以像上面的代碼那樣工作。如果任務被取消onPostExecute將不會運行,因此您的進度對話框不會被解除。它會調用onCancelled()。

相關問題