为自己记----android开发学习记录之网络请求

在android中,如何请求网络数据呢?

1 在 manifest 文件中添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2 选择一个Http Client

大多数连接网络的 Android app 使用 HTTP 来发送与接收数据.

Android 提供了两种 Http client:HttpURLConnection 和Apache HttpClient,只需要使用其中一种就可完成。

下面使用Apache HttpClient来完成

1 构建一个工具类HttpUtils

package com.fenglu.helpanywhere.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;


@SuppressWarnings("deprecation")
public class HttpUtils {

/**
* 请求方式
*/
private static final String REQUESTMETHOD_GET="GET";

private static final String REQUESTMETHOD_POST="POST";

/**
* @param url url地址
* @param method 提交方式,get或post
* @param params 参数
* @returnString
*/
public static String toService(String url, String method,List<NameValuePair> params) {
if(REQUESTMETHOD_GET.equals(method)){
return methodGet(url,params) ;
}else if(REQUESTMETHOD_POST.equals(method)){
return methodPost(url,params);
}
return null;
}

/**
* get
* @param url
* @param params
* @return
*/
private static String methodGet(String url,List<NameValuePair> params) {
url = url + "?" + URLEncodedUtils.format(params, "UTF-8");
HttpGet httpGet=new HttpGet(url);
return httpClientRequest(httpGet);
}

/**
* post
* @param url
* @param params
* @return
*/
private static String methodPost(String url,List<NameValuePair> params) {
HttpPost postRequest = new HttpPost(url);
UrlEncodedFormEntity entity=null;
try {
entity = new UrlEncodedFormEntity(params,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
postRequest.setHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
postRequest.setEntity(entity);
return httpClientRequest(postRequest);
}

private static String httpClientRequest(HttpUriRequest request){
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);
HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);
try {
HttpResponse httpResponse = new DefaultHttpClient(httpParams).execute(request);
HttpEntity entity = httpResponse.getEntity();
String res = EntityUtils.toString(entity, "UTF-8");
return res;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
 


2 使用该HttpUtils类

请求网络数据是一个耗时操作,需要异步请求,可以使用一个单独的线程,也可以使用AsyncTask 类,这里我使用的是AsyncTask 类来完成,我这里进行了简单的封装。

package com.fenglu.helpanywhere.util;


import java.util.ArrayList;
import java.util.List;


import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;


import android.os.AsyncTask;


@SuppressWarnings("deprecation")
public class AsyncHttpUtils{

private AsyncHttpUtils(){
}

private static class AsyncHttpUtilsHelpe{
private static final AsyncHttpUtils mInstance=new AsyncHttpUtils();
}

public static AsyncHttpUtils getInstance(){
return AsyncHttpUtilsHelpe.mInstance;
}

/**
* 举例login
* @param username
* @param password
* @param c
*/
public void login(String username,String password,CallBack c){
List<NameValuePair> params=new ArrayList<NameValuePair>();
NameValuePair pair=new BasicNameValuePair("username", username);
params.add(pair);
pair=new BasicNameValuePair("password", password);
params.add(pair);
request("url","POST",params,c);
}

/**
* 向服务器发送http请求都调用该方法
* @param url
* @param requestMethod
* @param params
* @param c
*/
private final void request(String url,String requestMethod,List<NameValuePair> params,CallBack c){
new AsyncHttpTask(c).execute(url,requestMethod,params);
}


//异步任务,请求http数据
private class AsyncHttpTask extends AsyncTask<Object, Void, String>{
private CallBack mCallBack;
public AsyncHttpTask(CallBack callBack){
this.mCallBack=callBack;
}
@Override
protected String doInBackground(Object... arg0) {
return HttpUtils.toService((String)arg0[0], (String)arg0[1], (List<NameValuePair>)arg0[2]);
}
@Override
protected void onPostExecute(String result) {
mCallBack.handleResult(result);
super.onPostExecute(result);
}
}

/**
* 回调接口
* @author lufeng
*/
public interface CallBack{
/**
* 可直接在在方法中更新ui
* @param result
*/
void handleResult(String result);
}
}

该类AsyncHttpUtils是提供给ui界面最终使用的类,在这里构建为一个单例模式的类,可以这样使用

例如:登录

AsyncHttpUtils. getInstance(). login(String username,String password,CallBack c);

当需要进行某种请求操作时可以在AsyncHttpUtils类中添加相应的方法,例如可以仿照如下方法

/**
 * 举例login
 * @param username
 * @param password
 * @param c
 */
public void login(String username,String password,CallBack c){
List<NameValuePair> params=new ArrayList<NameValuePair>();
NameValuePair pair=new BasicNameValuePair("username", username);
params.add(pair);
pair=new BasicNameValuePair("password", password);
params.add(pair);
request("url","POST",params,c);
}

CallBack 是一个回调接口,请求后的数据可以在该接口的实现类的方法中处理,并可以直接更新ui。所以可以让activity或其他view实现该接口。

所有的参数在这里被封装为一个List<NameValuePair>对象

在request("url","POST",params,c);中添加url,请求的方式(POST或GET)。


-------------------------

这是我写的第一篇,真不知该如何描述,如果有不正确的地方欢迎指出,如果有比较好的建议请留言,期望与大家共同进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值