2013-09-18 3 views
0

Я использую AsyncTask получить JSON данные из удаленного URL, но иногда это возвратное URL ошибки в данных JSON как это:как остановить AsyncTask, если какое-то условие истинно

{ 
    "error": { 
     "message": "(#803) Some of the aliases you requested do not exist: RNN.NES", 
     "type": "OAuthException", 
     "code": 803 
    } 
} 

в doInBackground, я проверить, если есть ошибка по ..

JSON
if(true) { 
    //cancel asynctask and show toast with message i use 
    cancel(true) 
} 

но я сделать что condititon это верно, но это не отменяется

это мой код:

private class MyAsyncTask extends AsyncTask<String, Void, Void> { 

     ProgressDialog mProgressDialog; 

     @Override 
     protected void onPostExecute(Void result) { 
      db = new DAOPages(context); 
      db.open(); 
      db.addPage(name, fid, picName); 
      getPagePrefs(fid); 
      db.close(); 
      mProgressDialog.dismiss(); 

      Intent intent = new Intent(context, PagePrefsActivity.class); 
      intent.putExtra("fPageid", fid); 
      context.startActivity(intent); 

     } 

     @Override 
     protected void onPreExecute() { 

      mProgressDialog = ProgressDialog.show(context, "Loading...", 
        "Data is Loading..."); 
     } 

     @Override 
     protected Void doInBackground(String... params) { 

      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 

      // getting JSON string from URL 
      JSONObject json = jParser.getJSONFromUrl(params[0]); 
      // addPageData(params[0]); 
      try { 

       if(json.getJSONObject("error") != null) { 
        Log.e("error", "true"); 
        cancel(true); 
       } 
       name = json.getString("name"); 
       fid = json.getString("id");         

       String picture = json.getJSONObject("picture") 
         .getJSONObject("data").getString("url"); 
       picName = downloadImage(picture, fid); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

Теперь, как я могу остановить это и показать тост ???

заранее спасибо

+0

http://stackoverflow.com/questions/16538714/stop-asynctask-doinbackground-method/16538887#16538887. проверьте ссылку, отправленную в ответ – Raghunandan

ответ

1

Метод cancel(true) не останавливает AsyncTask. Он просто вызывает onCancelled() вместо onPostExecute() после doInBackGround возвращает. Вы можете использовать AsyncTask.isCancelled(), который вернет true, если вы отмените AsyncTask, чтобы предотвратить дальнейшую обработку в doInBackground().

Так переопределите onCancelled() и поставьте свой тост туда.

private class MyAsyncTask extends AsyncTask<String, Void, Void> { 

     ProgressDialog mProgressDialog; 

     @Override 
     protected void onPostExecute(Void result) { 
      db = new DAOPages(context); 
      db.open(); 
      db.addPage(name, fid, picName); 
      getPagePrefs(fid); 
      db.close(); 
      mProgressDialog.dismiss(); 

      Intent intent = new Intent(context, PagePrefsActivity.class); 
      intent.putExtra("fPageid", fid); 
      context.startActivity(intent); 

     } 

     @Override 
     protected void onPreExecute() { 

      mProgressDialog = ProgressDialog.show(context, "Loading...", 
        "Data is Loading..."); 
     } 

     @Override 
     protected Void doInBackground(String... params) { 

      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 

      // getting JSON string from URL 
      JSONObject json = jParser.getJSONFromUrl(params[0]); 
      // addPageData(params[0]); 
      try { 

       if(json.getJSONObject("error") != null) { 
        Log.e("error", "true"); 
        cancel(true); // after this AsyncTask.isCancelled() returns true 
       } 

       if(!this.isCancelled()){ // if it's true, prevent further processing 
        name = json.getString("name"); 
        fid = json.getString("id");         

        String picture = json.getJSONObject("picture") 
          .getJSONObject("data").getString("url"); 
        picName = downloadImage(picture, fid); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     // will be called instead onPostExecute after a cancel 
     @Override 
     protected void onCancelled() { 
      // Show your Toast 
     } 
    } 
+0

спасибо вам, что она работает. –

0

Вы можете проверить с помощью isCancelled() в onPostExecute() метод и может показать Тост в том method.Here, как вы можете сделать это -:

@Override 
    protected void onPostExecute(Void result) { 
     if(isCancelled()) { 
      Toast.makeText(context, "your text", Toast.LENGTH_SHORT).show(); 
      return; 
     } 
     db = new DAOPages(context); 
     db.open(); 
     db.addPage(name, fid, picName); 
     getPagePrefs(fid); 
     db.close(); 
     mProgressDialog.dismiss(); 

     Intent intent = new Intent(context, PagePrefsActivity.class); 
     intent.putExtra("fPageid", fid); 
     context.startActivity(intent); 

    } 
Смежные вопросы