2016-02-16 23 views
2

我正在使用Volley在我的應用程序中進行網絡調用......對於很多屏幕......(說片段)我正在提出諸如LoginRequest,FetchUsers Request,FetchExams Request等各種請求。 ....並處理每個片段中的響應和錯誤。在結構化模式下在android中使用Volley庫

什麼是我可以像使用最好的辦法.... 1.子類的請求 2.創建一個接口/回調 3.獲取結果/響應或在我的片段錯誤響應...

這就是我正在做的....創造了許多這樣的方法.....

private void syncAllUsers() { 
     progressDialog.setMessage("Loading Users..."); 

     StringRequest jsonProductCategoryFetchRequest = new StringRequest(Request.Method.POST, Config.SELECT_USERS, 
       new Response.Listener<String>() { 

        @Override 
        public void onResponse(String response) { 
         try { 
          if(Constants.DEBUG_MODE_ON) 
           Log.d(Constants.DEBUG_LOG, "RESPONSE for Teachers: "+response); 

          JSONObject result = new JSONObject(response); 
          boolean code = result.getBoolean("error"); 

          if (!code) { 
           //Get the Users Json Array 
           JSONArray ja = result.getJSONArray("users"); 
           if(ja != null) { 
            db.deleteAllUsers(); 
            for (int i = 0; i < ja.length(); i++) { 
             JSONObject jobj = ja.getJSONObject(i); 
             User user = new User(); 
             user.setId(jobj.getInt(User.KEY_ID)); 
             user.setName(jobj.getString(User.KEY_NAME)); 
             user.setEmail(jobj.getString(User.KEY_EMAIL)); 
             user.setPhone(jobj.getString(User.KEY_PHONE)); 
             user.setGender(jobj.getString(User.KEY_GENDER)); 
             user.setUsername(jobj.getString(User.KEY_USERNAME)); 
             user.setPassword(jobj.getString(User.KEY_PASSWORD)); 
             user.setOrganization_id(jobj.getString(User.KEY_ORGANIZATION_ID)); 
             user.setDob(jobj.getString(User.KEY_DOB)); 
             user.setStatus(jobj.getString(User.KEY_STATUS)); 
             user.setApi_key(jobj.getString(User.KEY_API_KEY)); 
             user.setDate_created(jobj.getString(User.KEY_DATE_CREATED)); 
             user.setRole_id(jobj.getInt(User.KEY_ROLE_ID)); 

             //Delete local Teachers before updating 
             db.createUser(user); 

            } // for loop ends 
           } 
          } 

          //syncAllExams(); 
          progressDialog.dismiss(); 
          getActivity().finish(); 
          startActivity(new Intent(getActivity(), MainActivity.class)); 

         } catch (Exception e) { 
          Log.d(Constants.DEBUG_LOG, "Exception Syncing Users: " , e); 
          Toast.makeText(getActivity(),"Something went wrong while fetching users", Toast.LENGTH_SHORT).show(); 
          progressDialog.dismiss(); 
          getActivity().finish(); 
          startActivity(new Intent(getActivity(), MainActivity.class)); 
         } 
        } 
       } , new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       if(Constants.DEBUG_MODE_ON) 
        Log.d(Constants.DEBUG_LOG, "Error Response for Users : "+error.getCause()+""+error.toString()); 
       Toast.makeText(getActivity(), getString(R.string.no_internet), Toast.LENGTH_SHORT).show(); 
       progressDialog.dismiss(); 
       getActivity().finish(); 
       startActivity(new Intent(getActivity(), MainActivity.class)); 

      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<String, String>(); 

       params.put(User.KEY_ORGANIZATION_ID, preferencesManager.getOrganizationID()); 
       params.put(User.KEY_API_KEY, preferencesManager.getApiKey()); 
       Log.d("Registration", "PARAMS : " + params.entrySet()); 
       return params; 
      } 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       HashMap<String, String> params = new HashMap<String, String>(); 
       // params.put("Content-Type", "application/json; charset=utf-8"); 
       params.put("Content-Type", "application/x-www-form-urlencoded"); 

       String auth = preferencesManager.getApiKey(); 
       params.put("Authorization", auth); 
       return params; 
      } 
     }; 


     MyApplication.getInstance().addToReqQueue(jsonProductCategoryFetchRequest); 
    } 

我認爲會有執行此清潔方式。有什麼建議麼。

回答

1

我一直在使用這個類來創建請求,它使用gson將你的json轉換成automaticaly對象。在這裏找到示例: https://gist.github.com/ficusk/5474673

+0

是Vulovic ......這是我一直在尋找的......還有些混亂....我如何使用這個GsonRequest ....這是一個用戶定義的類或屬於凌空。另外...你可以詳細闡述一下代碼分離......如何在創建請求時避免重複代碼...... –

+0

我使用下面的鏈接來創建處理程序所需的所有類。基本上,您將爲每個要發送的請求創建一個類。 http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/ http://stackoverflow.com/questions/24873718/how-do-i-make- a-volley-jsonobject-request-with-a-custom-object-as-a-parameter http://benjii.me/2010/04/deserializing-json-in-android-using-gson/ –

1

創建請求管理器..哪些只處理請求您的Web服務。該管理器還應該處理任何網絡錯誤和其他不是應用程序層的錯誤。

從業務邏輯所在的Model類中使用此請求管理器。將請求參數作爲JSON發送。您也可以將不同的偵聽器發送到請求管理器。因此,當Web服務響應到達時,它將直接發送給您Model類,並且可以根據您的需要解析JSON響應。

這種解析邏輯與Model類保持一致,並且請求邏輯與Request管理器保持一致。所以在將來,如果您更改Web服務地址,您只需要檢查一個地方。如果您更改webservice的請求和響應參數,不需要更改請求管理器,只有型號類...

可能有一些其他的方式..

public final class RequestManager { 

private static final String ROOT_HOST = //Your Webservice Host Root. 


private RequestQueue queue; 

public RequestManager(final Context context) { 
     queue = Volley.newRequestQueue(context); 
} 

//Internal Calling method .. Not exposed.. 
private void doRequest(final int method, final String url, final JSONObject jsonParam, final Response.Listener<JSONObject> listener, 
        final Response.ErrorListener errlsn) { 

      JSONObjectRequest jsonObjectRequest = new SONObjectRequest(method, url, jsonParam, listener, errlsn); 
      queue.add(jsonObjectRequest); 
} 

public void doLogin(final User user, final Response.Listener<JSONObject> listener, final Response.ErrorListener errlsn) 
        throws Exception { 
      // Make login request JSON here 
      if (user == null || listener == null || errlsn == null) { 
        //throw Exception 
      } 
      final JSONObject jsonObj = new JSONObject(); 
      //Convert user object to JSON Object 
      doRequest(Request.Method.GET, LOGIN_URL, jsonObj, listener, errlsn); 

    } 
} 
+1

可以給你代碼提示,如果你想.. – ValayPatel

+0

確實......你可以分享一些例子。 –

+0

其實我看到的是:創建一個包說任務....與請求類,並在需要時調用它們在我的片段.... –

相關問題