在Android應用中,除了單機版的應用,其余的應用免不了需要頻繁地與服務端進行數據交互,如果每一種方法都獨立寫一段代碼,那會造成代碼大量重復,冗余,這不是我們所希望的,所以我們可以對其進行一些封裝,這樣不但可以提高代碼質量,最重要的是我們自己用起來也爽啊。
首先,我們先建立個webservice文件夾,再在裡面新建3各類:HttpUtils.java ;Webservice.java ;WebserviceHelp.java。
先介紹WebserviceHelp,這個類裡面不含任何方法代碼,只包含一些參數。
public class WebserviceHelp
{
/**IP地址或域名*/
protected static String IP = "";
/**Webservice提供地址 */
protected static String URL = IP +"";
/*************下面是方法名*************/
/**用戶登錄**/
protected static final String Login ="login";
}
接下來我們看看HttpUtils,這個類作用是實現參數的提交,我這裡就只列出了post提交方法。
package sedion.zhr.webservice;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import android.util.Log;
public class HttpUtils
{
/**作為標記在*/
private static final String TAG = "HttpUtils處理類";
/**用戶識別*/
public static final String User_Agent="";
private static JSONObject postrequest(String url,List<NameValuePair> params)
{
//在這裡可以進行一些處理,如添加時間戳,對參數進行排序等等
try
{
//建立JSONObject對象
JSONObject object=null;
//建立HttpClient對象
HttpClient httpClient=new DefaultHttpClient();
//設置請求路徑
HttpPost post=new HttpPost(url);
//設置請求參數
post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
//設置用戶識別
post.addHeader("User-Agent", User_Agent);
//建立HttpParams對象
HttpParams httpParams=post.getParams();
//設置讀取超時
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,10000);
//設置請求超時
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
//發送請求獲得回饋
HttpResponse httpResponse=httpClient.execute(post);
//取得反饋信息
HttpEntity httpEntity=httpResponse.getEntity();
//如果httpEntity不為空
if(httpEntity!=null )
{
String result=EntityUtils.toString(httpEntity);
object=new JSONObject(result);
Log.i(TAG, "post請求成功:"+ result);
return object;
}
else
{
Log.e(TAG, "post請求失敗");
return null;
}
}
catch (Exception e)
{
Log.i(TAG,e.toString());
return null;
}
}
/**
* post方法傳參
* @param url ip路徑
* @param method 方法名
* @param params 參數
* @return
*/
public static JSONObject post(String url,String method,List<NameValuePair> params) throws Exception
{
return postrequest(url+method, params);
}
}
最後就是Webservice類了,這裡寫所需功能了,這個類要繼承WebserviceHelp類,這裡以登錄為例子。
public class Webservice extends WebserviceHelp
{
private static final String Webservice_Tag="網絡服務";
/***
* 用戶登陸
* @param userPhone 手機號
* @param password 密碼
* @return
*/
public static int login(String userPhone,String password)
{
JSONObject object;
try
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("userPhone",userPhone));
params.add(new BasicNameValuePair("password",password));
object = HttpUtils.post(URL, Login, params);
return object.optInt("results");
}
catch(Exception e)
{
Log.e(Webservice_Tag+Login, e.toString());
return -1;
}
}
}
以上方法便已封裝好了,接下來就是activity中調用了,別的代碼我就不給出了,這裡就只是一個異步處理類。
private class LoginAsyncTask extends AsyncTask<String, Integer, Integer>
{
@Override
protected Integer doInBackground(String... str)
{
if(SystemUtil.isNetworkConnected(LoginActivity.this))
{
int result = 0;
try
{
//這裡str[0],str[1]分別為獲得的手機號,密碼
result = Webservice.login(str[0], str[1]);
} catch (Exception e)
{
Log.e(LOG_TAG, ""+result);
e.printStackTrace();
}
return result;
}
else
{
return NO_NET;
}
}
@Override
protected void onPostExecute(Integer result)
{
switch (result)
{
case NO_NET:
ToastUtils.show(LoginActivity.this,R.string.no_net);
break;
case SYSTEM_ERROR:
ToastUtils.show(LoginActivity.this, R.string.system_error);
break;
case FAIL:
ToastUtils.show(LoginActivity.this, R.string.login_fail);
break;
case SUCCESS:
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
break;
default:
break;
}
}
接下來別還需要別的功能方法就可以直接寫在Webservice類裡了,然後直接在activity中調用,怎麼樣,是不是很方便呢。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11