2015-12-02 42 views
2

我正在執行任務,調用我的AsyncTask,執行async task,我等待20秒從服務器獲取數據,如果它仍在加載我取消它(處理超時)我的AsyncTask沒有被取消android

public void handleServerTimeOut() { 
     getStore = new GetStore(); 
     getStore.execute(); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (getStore != null && getStore.getStatus() != AsyncTask.Status.FINISHED) { 
        boolean result = getStore.cancel(true); 
        Log.e(TAG, " handleServerTimeOut() reached 20 seconds"); 
        Log.e(TAG, "" + result); 
       } 
      } 
     }, 20000); 
    } 

的AsyncTask

class GetStore extends AsyncTask<Void, Void, String> { 

     String status, message; 
     JSONArray jsonArray; 
     String buildingIdGuest, buildingIdUser, finalBuildingID; 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      if (isCancelled()) { 
       return; 
      } else { 
       buildingIdUser = utilClass.getSharePerefernce(getActivity(), KEY_BUILDING_ID_USER, ""); 
       buildingIdGuest = utilClass.getSharePerefernce(getActivity(), KEY_BUILDING_ID_GUEST, ""); 
       if (buildingIdUser.equals("0") || buildingIdUser.equals("")) { 
        finalBuildingID = buildingIdGuest; 
       } else { 
        finalBuildingID = buildingIdUser; 
       } 


       error_flag = 0; 
       gridView.setVisibility(View.VISIBLE); 
       error_layout.setVisibility(View.INVISIBLE); 
       img_no_internet.setVisibility(View.INVISIBLE); 
       img_no_results.setVisibility(View.INVISIBLE); 
       img_server_error.setVisibility(View.INVISIBLE); 
       progressDialog.setMessage("Getting nearby stores ..."); 
       progressDialog.setIndeterminate(true); 
       progressDialog.setCancelable(true); 
       progressDialog.show(); 
      } 

     } 

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

      if (NetworkCheck.isNetworkAvailable(getActivity())) { 
       try { 

        jsonObj = userFunction.getStores(OS, MAKE, MODEL, finalBuildingID); 

        Log.e(TAG, jsonObj.toString()); 
        status = jsonObj.getString("status"); 
        message = jsonObj.getString("message"); 

        if (status.equalsIgnoreCase("success")) { 
         jsonArray = jsonObj.getJSONArray("response"); 

         for (int i = 0; i < jsonArray.length(); i++) { 
          gridModel = new GridModel(); 
          gridModel.setId(jsonArray.getJSONObject(i).getString("id")); 
          gridModel.setStore_name(jsonArray.getJSONObject(i).getString("name")); 
          gridModel.setImage_name(jsonArray.getJSONObject(i).getString("image_name")); 
          gridListData.add(gridModel); 


         } 
         Log.e(TAG, "****** = " + gridListData.toString()); 

        } else if (status.equalsIgnoreCase("invalid parameters")) { 
         error_flag = 2; 
         Log.e(TAG, "invalid parameters"); 
        } else if (status.equalsIgnoreCase("no stores")) { 
         error_flag = 3; 
         Log.e(TAG, "No Data"); 
        } 

        Log.e(TAG, "****** status " + status); 
        return String.valueOf(jsonObj); 
       } catch (Exception e) { 
        error_flag = 1; // Handling server timeout. 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          progressDialog.dismiss(); 
          return; 
         } 
        }); 
        Log.e(TAG, e.toString()); 
       } 
      } else { 
       Log.e(TAG, "Network Error"); 
       error_flag = 1; 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String response) { 
      super.onPostExecute(response); 

      Log.e(TAG, " **** error **** " + error_flag); 

      if (error_flag == 1) { 
       gridView.setVisibility(View.GONE); 
       error_layout.setVisibility(View.VISIBLE); 
       img_no_internet.setVisibility(View.VISIBLE); 
      } else if (error_flag == 2) { 
       gridView.setVisibility(View.GONE); 
       error_layout.setVisibility(View.VISIBLE); 
       img_server_error.setVisibility(View.VISIBLE); 
       txtError.setVisibility(View.VISIBLE); 
       txtError.setText(message); 
      } else if (error_flag == 3) { 
       gridView.setVisibility(View.GONE); 
       error_layout.setVisibility(View.VISIBLE); 
       img_no_results.setVisibility(View.VISIBLE); 
      } 
      gridAdapter = new GridAdapter(getActivity(), gridListData); 
      gridView.setAdapter(gridAdapter); 
      if ((progressDialog != null) && progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
      } 
     } 
    } 

我也想取消我AsyncTask當用戶取消ProgressDialog

回答

2

您只需在AsyncTask - onPreExecute()方法中檢查isCancelled()一次。當您在任務實例上調用cancel()時,此檢查已被評估,這就是異步任務仍在完成並更新UI的原因。

爲了解決這個問題,我建議您使用isCancelled()方法包含更多的取消檢查。在您更新用戶界面之前,在onPostExecute()方法中包含這樣一個檢查的明顯位置。在收到響應之後,您也可以在向服務器發出實際請求之前包括一個檢查。

+0

嘗試了您的建議,但不工作;( –