2014-02-27 77 views
0

我有rpc 2.0服務器,我提出請求並獲得響應。在onPreExecute方法中,我定義了ProgressDialog並調用show方法,並在onPostExecute方法中調用了關閉ProgressBar,但我的請求進度和進度對話框在最後一個進程中顯示時,我的活動可能會有人幫我解決這個問題嗎?ProgressDialog後期顯示,活動滯後使用AsyncTask

RequestClass:

public class HomeCommRequest { 

    public static final int ID_GET_MOBILE_AUTH_TOKEN = 1; 
    public static final int ID_PIN_LOGIN = 2; 
    public static final int ID_GET_ALL_DEVICES_LIST = 3;  
    public static final int ID_GET_DEVICES_LIST = 4; 
    public static final int ID_GET_CU_INFO = 5; 
    public static final int ID_GET_DEVICE_INFO = 6; 
    public static final int ID_GET_USER_INFO = 7; 
    public static final int ID_CHANGE_DEVICE_ALARM_STATE = 8; 
    public static final int ID_CHANGE_CU_ALARM_STATE = 9; 
    public static final String METHOD_GET_USER_INFO = "getUserInfo"; 
    public static final String METHOD_GET_CU_INFO = "getCentralUnitInfo"; 
    public static final String METHOD_GET_ALL_DEVICES_LIST = "getAllDevicesList"; 
    public static final String METHOD_GET_MOBILE_AUTH_TOKEN = "getMobileAuthToken"; 
    public static final String METHOD_PIN_LOGIN = "pinLogin"; 
    public static final String METHOD_GET_DEVICES_LIST = "getDevicesList"; 
    public static final String METHOD_CHANGE_DEVICE_ALARM_STATE = "changeAlarmState"; 
    public static final String METHOD_CHANGE_CU_ALARM_STATE = "changeCUAlarmState"; 
    public static final String METHOD_GET_DEVICE_INFO = "getDeviceInfo"; 

    private Map<String,Object> params; 
    private Context context; 
    private int id; 
    private String cookie; 
    private String method; 
    private ProgressDialog dialog; 
    private String serverURL = "MY SERVER URL" 

    public HomeCommRequest(int id, String method, Map<String,Object> params, String cookie, Context context) 
    { 
     this.id = id; 
     this.method = method; 
     this.params = params; 
     this.cookie = cookie; 
     this.context = context; 
    } 

    public <T> T send() 
    { 
     T resp = null; 
     doRequest request = new doRequest(); 
     request.execute(); 
     try { 
      resp = (T) request.get(); 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return resp; 
    } 



    private String inputStreamToString(InputStream is) { 
     String s = ""; 
     String line = "";  
     // Wrap a BufferedReader around the InputStream 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is));  
     // Read response until the end 
     try { 
      while ((line = rd.readLine()) != null) { s += line; } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
     // Return full string 
     return s; 
    } 
    private JSONObject sendRequest(String method, Map<String,Object> params, int id, String cookieToRequest) throws Exception 
    { 
     String result = null; 
     //Packing inputed parameters into second massive for rpc request 
     List paramsToSend = new ArrayList(); 
     paramsToSend.add(params); 
     // Creating a new JSON-RPC 2.0 request 
     JSONRPC2Request reqOut = new JSONRPC2Request(method, paramsToSend, id);  
     HttpClient client = new DefaultHttpClient(); 
     //Creating new HttpPost entry for POST request 
     HttpPost post = new HttpPost(serverURL); 
     if(cookieToRequest != null) 
      post.setHeader("Cookie", "sid=" + cookieToRequest);  

     HttpResponse response = null; 
     try { 
      //Push JSON string in request 
      post.setEntity(new StringEntity(reqOut.toJSONString())); 
      //Get response from server 
      response = client.execute(post); 
     } catch (UnsupportedEncodingException e) {   
      e.printStackTrace();   
     } 
     catch(Exception e) 
     { 
      e.printStackTrace();    
     } 
     //Get string from respond entry 
     HttpEntity entity = response.getEntity(); 
     InputStream instream = null; 
     if (entity != null) {   
      try { 
       instream = entity.getContent(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace();     
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace();  
      } 
     //Convert respond to string 
      result = inputStreamToString(instream); 
     Log.i("HomeCommRequest", "Message from server = " + result);  
     } 
     return new JSONObject(result); 
    } 

    public class doRequest extends AsyncTask<Void, Void, Response> 
    { 
     @Override 
     protected void onPreExecute() {   
      super.onPreExecute(); 

     dialog = new ProgressDialog(context, ProgressDialog.THEME_HOLO_LIGHT); 
      dialog.setMessage("Please, wait..."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     @Override 
     protected Response doInBackground(Void... backgroundParams) { 

      Response response = null; 
      try { 
       JSONObject jsonResponseObj = sendRequest(method, params, id, cookie);    

       switch(id) 
       { 

case ID_PIN_LOGIN: response = new PinLoginResponse(jsonResponseObj);        

default: Log.e("Request", "Error. doBackground. Invalid id value in switch = " + id); 
       } 
       publishProgress(); 

      } catch (Exception e) {    
       e.printStackTrace(); 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(Response result) { 
      if(dialog.isShowing()) 
       dialog.dismiss(); 

      if(result.hasError()) 
      { 
       AlertDialog.Builder ad = new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_LIGHT); 
       ad.setTitle("Error!"); 
       ad.setMessage(result.getErrorString()); 
       ad.setPositiveButton("Dismiss", new DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int which) {}    
       }); 
       AlertDialog add = ad.create(); 
       add.show(); 
      } 
      super.onPostExecute(result);    
     } 

    } 

} 

性反應的類的實例:

public class PinLoginResponse extends Response { 

    private String sessionKey; 
    private JSONObject jsonObj; 
    private final String TAG = "PinLoginResponse"; 
    public PinLoginResponse(JSONObject jsonObj){ 
     this.jsonObj = jsonObj; 
     parse(jsonObj); 
    } 

    public String getSessionKey() { 
     return sessionKey; 
    } 

    public String getErrorStr() 
    { 
     return errorStr; 
    } 

    @Override 
    public void parse(JSONObject jsonObject) 
    { 
     errorStr = "No errors"; 
     try { 
      errorStr = jsonObject.get("errors").toString(); 
      isError = true; 
      Log.e(TAG, errorStr + " | " + isError); 
     } catch (JSONException e) { 
      isError = false; 
      //e.printStackTrace(); 
     } 

     try { 
      sessionKey = jsonObject.get("result").toString(); 
     } catch (JSONException e) { 
      Log.e(TAG, "No results found"); 
      e.printStackTrace(); 
     }  

    } 




} 

怎麼我用它在我的活動:

void getSessionKey(String pincode) 
    { 
     Map<String,Object> params = new HashMap<String,Object>(); 
     params.put("token", token); 
     params.put("pin", pincode); 
     HomeCommRequest pinauthRequest = new  HomeCommRequest(HomeCommRequest.ID_PIN_LOGIN, 
                  HomeCommRequest.METHOD_PIN_LOGIN, 
                  params, 
                  null, 
                  EnterPincodeActivity.this); 
     PinLoginResponse getSessionKeyRequest = pinauthRequest.send(); 
     if(!getSessionKeyRequest.hasError()) 
     { 
      finish(); 
      Intent tabHostActivityIntent = new Intent(EnterPincodeActivity.this, TabsViewActivity.class); 
      tabHostActivityIntent.putExtra("cookie", getSessionKeyRequest.getSessionKey()); 
      startActivity(tabHostActivityIntent); 
     } 

回答

0
resp = (T) request.get(); 

阻塞UI線程。 您應該處理onPostExecute()中的任何響應,而不強制主線程等待doInBackground()完成。

+0

當您調用.get()時,主線程(UI)會凍結,因此在doInBackground()完成之前不會執行圖形計算。試試看,你會看到。不能保證在.get()之前調用onPreExecute(),即使它被稱爲ProgressBar也不會更新。 – x11

+0

那麼,我如何才能實現服務器請求的過程進度? Runnuble接口對於這種情況是很好的選擇? – Govtart

+0

AsyncTask就好,你需要通知onPostExecute你的Activity從服務器收到響應。例如,將你的活動作爲參數'pinauthRequest.send(yourActivity);'並將AsyncTask作爲參數。 – x11

相關問題