2014-10-01 87 views
0

我收到来自服务的json数据。我使用asynctask来获取数据。当数据为空时,我想取消asynstask并向用户显示一些消息。我如何取消asyntask并显示吐司消息

 public class MainActivity extends ActionBarActivity { 

      // Progress Dialog 
      private ProgressDialog pDialog; 

      private LoadCategories mTask; 

    ..... 

    /** 
      * Listening to Load More button click event 
      * */ 
      btnLoadMore.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View arg0) {     
        if (URL_CATEGORY == null || URL_CATEGORY == "") 
        {Toast.makeText(MainActivity.this,"URL est vide", Toast.LENGTH_LONG).show();} 
        else 
        { // Starting a new async task 
         //new LoadCategories().execute(); 
         mTask = new LoadCategories(); 
         mTask.execute(); 
         }    
       } 
      }); 

    .... 

    class LoadCategories extends AsyncTask<String, String, String> { 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       pDialog = new ProgressDialog(MainActivity.this); 
       pDialog.setMessage("en cours..."); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(true); 

       pDialog.show(); 
      } 

      @Override 
      protected String doInBackground(String... args) { 
       // Building Parameters 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 

       // getting JSON string from URL 
       String json = jsonParser.makeHttpRequest(URL_CATEGORY, "GET", 
         params); 

       if (json == null || json == "") 
       { 
        mTask.cancel(true); 
    //    if(isCancelled()) 
    //    {Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();} 
        synchronized(this) { 
         while (json.length() == 0) { 
          if(mTask.isCancelled()) 
          { Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}      
         } 
        } 
       } 
       // Check your log cat for JSON reponse 
       Log.d("Categories JSON: ", "> " + json); 
       return json; 
      } 

      @Override 
      protected void onPostExecute(String json) { 
       try { 
        categories = new JSONArray(json); 
        categoryList.clear(); 
        if (categories != null) { 
         // looping through All albums 
         for (int i = 0; i < categories.length(); i++) { 
          JSONObject c = categories.getJSONObject(i); 
..... 

我的问题程序从不取消并显示消息。 当我调试它,它进入到我的病情

if (json == null || json == "") 
      { 
       mTask.cancel(true); 
//    if(isCancelled()) 
//    {Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();} 
       synchronized(this) { 
        while (json.length() == 0) { 
         if(mTask.isCancelled()) 
         { Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}      
        } 
       } 
      } 

回答

1

尝试像这样...

protected String doInBackground(String... args) { 
     // code 
     if (json.equals(null) || json.equals("")){ 
      if(mTask.isCancelled()) break; 
      return null; 
     } 

     return json; 
    } 

onPostExecute

protected void onPostExecute(String json) { 
    if(json.equals(null) || json.equals("")){ 
     // Make a toast Message 
    }else{ 
     // your code 
    } 

没有必要取消异步任务....

0

在异步类的背景,而只是检查isCancelled()一次:

protected String doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 
0

从Android文档,你可以重写onCancelled()方法如果的AsyncTask被取消

取消任务
任务可以在任何取消将被称为时间通过调用 cancel(boolean)。调用此方法将导致对 isCancelled()的后续调用返回true。调用此方法后,将在doInBackground(Object [])返回后调用 onCancelled(Object),而不是onPostExecute(Object) 。如果 可能为了确保任务 尽快取消,应始终从doInBackground检查isCancelled(返回 值)定期(对象[]),(内部例如一个循环。)

,或者你也可以检查isCancelled在循环例如:

if (isCancelled()) { 
    Toast.makeText(getContext(), "AsyncTask is Cancelled", Toast.LENGTH_SHORT).show(); 
    break; 
} 
else 
{ 
    // some process 
} 
0

如果你想处理一个取消事件,在您的LoadCategories类中重写的AsyncTaskonCancelled()方法。将代码显示为您自己的onCancelled()方法。

但是,我认为mTask.cancel()是没有必要的。我建议检查json的值,并决定在onPostExecute()中显示敬酒信息。