在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中調用,怎麼樣,是不是很方便呢。