在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中调用,怎么样,是不是很方便呢。