1. 程式人生 > >Android之提交資料到服務端方法簡單封裝

Android之提交資料到服務端方法簡單封裝

在Android應用中,除了單機版的應用,其餘的應用免不了需要頻繁地與服務端進行資料互動,如果每一種方法都獨立寫一段程式碼,那會造成程式碼大量重複,冗餘,這不是我們所希望的,所以我們可以對其進行一些封裝,這樣不但可以提高程式碼質量,最重要的是我們自己用起來也爽啊。

首先,我們先建立個webservice資料夾,再在裡面新建3各類:HttpUtils.java   ;Webservice.java  ;WebserviceHelp.java。

先介紹WebserviceHelp,這個類裡面不含任何方法程式碼,只包含一些引數。

 1 public class WebserviceHelp 
2 { 3 /**IP地址或域名*/ 4 protected static String IP = ""; 5 /**Webservice提供地址 */ 6 protected static String URL = IP +""; 7 8 9 /*************下面是方法名*************/ 10 11 /**使用者登入**/ 12 protected static final String Login ="login"; 13 14
}

接下來我們看看HttpUtils,這個類作用是實現引數的提交,我這裡就只列出了post提交方法。  

 1 package sedion.zhr.webservice;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.http.HttpEntity;
 6 import org.apache.http.HttpResponse;
 7 import org.apache.http.NameValuePair;
 8 import org.apache.http.client.HttpClient;
9 import org.apache.http.client.entity.UrlEncodedFormEntity; 10 import org.apache.http.client.methods.HttpPost; 11 import org.apache.http.impl.client.DefaultHttpClient; 12 import org.apache.http.params.CoreConnectionPNames; 13 import org.apache.http.params.HttpParams; 14 import org.apache.http.util.EntityUtils; 15 import org.json.JSONObject; 16 17 import android.util.Log; 18 19 20 public class HttpUtils 21 { 22 /**作為標記在*/ 23 private static final String TAG = "HttpUtils處理類"; 24 /**使用者識別*/ 25 public static final String User_Agent=""; 26 27 28 29 private static JSONObject postrequest(String url,List<NameValuePair> params) 30 { 31 //在這裡可以進行一些處理,如新增時間戳,對引數進行排序等等 32 33 try 34 { 35 //建立JSONObject物件 36 JSONObject object=null; 37 //建立HttpClient物件 38 HttpClient httpClient=new DefaultHttpClient(); 39 //設定請求路徑 40 HttpPost post=new HttpPost(url); 41 //設定請求引數 42 post.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); 43 //設定使用者識別 44 post.addHeader("User-Agent", User_Agent); 45 //建立HttpParams物件 46 HttpParams httpParams=post.getParams(); 47 //設定讀取超時 48 httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,10000); 49 //設定請求超時 50 httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 51 //傳送請求獲得回饋 52 HttpResponse httpResponse=httpClient.execute(post); 53 //取得反饋資訊 54 HttpEntity httpEntity=httpResponse.getEntity(); 55 //如果httpEntity不為空 56 if(httpEntity!=null ) 57 { 58 String result=EntityUtils.toString(httpEntity); 59 object=new JSONObject(result); 60 61 Log.i(TAG, "post請求成功:"+ result); 62 63 return object; 64 } 65 else 66 { 67 Log.e(TAG, "post請求失敗"); 68 return null; 69 } 70 } 71 catch (Exception e) 72 { 73 74 Log.i(TAG,e.toString()); 75 return null; 76 77 } 78 79 } 80 81 /** 82 * post方法傳參 83 * @param url ip路徑 84 * @param method 方法名 85 * @param params 引數 87 * @return 88 */ 89 public static JSONObject post(String url,String method,List<NameValuePair> params) throws Exception 90 { 91 92 return postrequest(url+method, params); 93 } 94 95 }

最後就是Webservice類了,這裡寫所需功能了,這個類要繼承WebserviceHelp類,這裡以登入為例子。

 1 public class Webservice extends WebserviceHelp
 2 {
 3      
 4     private static final String  Webservice_Tag="網路服務";
 5     
 6         /***
 7      * 使用者登陸     
 8      * @param userPhone 手機號
 9      * @param password 密碼
10      * @return
11      */
12     public static int login(String userPhone,String password)
13     {
14         JSONObject object;
15         
16         try     
17         {
18             List<NameValuePair> params = new ArrayList<NameValuePair>();
19             
20             params.add(new BasicNameValuePair("userPhone",userPhone));
21             params.add(new BasicNameValuePair("password",password));
22             
23             object = HttpUtils.post(URL, Login, params);
24         
25                
26             return object.optInt("results");
27             
28         }
29         catch(Exception e)
30         {
31             Log.e(Webservice_Tag+Login, e.toString());
32             return -1;
33         }
34         
35     }
36 }

以上方法便已封裝好了,接下來就是activity中呼叫了,別的程式碼我就不給出了,這裡就只是一個非同步處理類。

 1  private class LoginAsyncTask extends AsyncTask<String, Integer, Integer>
 2      {
 3 
 4         @Override
 5         protected Integer doInBackground(String... str)
 6         {
 7             if(SystemUtil.isNetworkConnected(LoginActivity.this))
 8             {
 9                 int result = 0;
10                 try 
11                 {
12                     //這裡str[0],str[1]分別為獲得的手機號,密碼
13                     result = Webservice.login(str[0], str[1]);
14                     
15 
16                 } catch (Exception e) 
17                 {
18                     Log.e(LOG_TAG, ""+result);
19                     e.printStackTrace();
20                 }
21                 return result;
22             }
23             else
24             {
25                 return NO_NET;
26             }
27         }
28         
29         @Override
30         protected void onPostExecute(Integer result)
31         {
32             
33             
34             
35             switch (result)
36             {
37             case NO_NET:
38                 ToastUtils.show(LoginActivity.this,R.string.no_net);
39                 break;
40             case SYSTEM_ERROR:
41                 ToastUtils.show(LoginActivity.this, R.string.system_error);
42                 break;
43             case FAIL:
44                 ToastUtils.show(LoginActivity.this, R.string.login_fail);
45                 break;
46             case SUCCESS:
47  
48                 Intent intent = new Intent(LoginActivity.this,MainActivity.class);
49                 startActivity(intent);
50                 break;
51             default:
52                 break;
53             }
54         }

接下來別還需要別的功能方法就可以直接寫在Webservice類裡了,然後直接在activity中呼叫,怎麼樣,是不是很方便呢。