网络封装 android,Android Http网络请求封装"/>
网络封装 android,Android Http网络请求封装
1.先写一个接口OnHttpRequest.java,用来回调
package com.jandar.http;
public interface OnHttpRequest {
/**
* 执行加载之前会先判断是否有网络,若无网络则此方法被回调
*/
public void httpNoInternet();
/**
* 开始加载时回调此方法,可在此处设置进度条
*/
public void httpStartLoad();
/**
* 加载出错时回调,例如服务器未开启,加载超时等错误
*/
public void httpError();
/**
* 返回请求结果
*/
public void httpResult(String result);
}
2.再封装HttpHandler类
package com.jandar.http;
import android.os.Handler;
import android.os.Message;
public class HttpHandler extends Handler {
private OnHttpRequest request;
public static final int HTTP_NO_INTERNET = 100;
public static final int HTTP_START = 101;
public static final int HTTP_ERROR = 102;
public static final int HTTP_COMPLETE = 103;
public HttpHandler(OnHttpRequest request) {
this.request = request;
}
@Override
public void handleMessage(Message msg) {
if (request == null) {
return;
}
switch (msg.what) {
case HTTP_NO_INTERNET:
request.httpNoInternet();
break;
case HTTP_START:
request.httpStartLoad();
break;
case HTTP_ERROR:
request.httpError();
break;
case HTTP_COMPLETE:
request.httpResult(msg.obj.toString());
break;
}
}
}3.
写公共Activity类,用于子类继承
package com.jandar.ui;
import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.ConnectivityManager;
import android.NetworkInfo;
import android.os.Bundle;
import android.os.Message;
import com.jandar.http.HttpHandler;
import com.jandar.http.OnHttpRequest;
public class BaseActivity extends Activity {
private HttpHandler handler;
protected void setOnHttpRequest(OnHttpRequest request) {
handler = new HttpHandler(request);
}
protected void getResult(final String url) {
new Thread() {
@Override
public void run() {
if (!isConnected()) {
handler.sendEmptyMessage(HttpHandler.HTTP_NO_INTERNET);
return;
}
handler.sendEmptyMessage(HttpHandler.HTTP_START);
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
try {
HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();
if (is == null) {
handler.sendEmptyMessage(HttpHandler.HTTP_ERROR);
return;
}
StringBuilder builder = new StringBuilder();
byte[] buffer = new byte[1024];
int index = -1;
while ((index = is.read(buffer)) != -1) {
builder.append(new String(buffer, 0, index));
}
is.close();
handler.sendMessage(Message.obtain(handler, HttpHandler.HTTP_COMPLETE,
builder.toString()));
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(HttpHandler.HTTP_ERROR);
}
}
}.start();
}
// 判断是否存在网络
private boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
NetworkInfo[] info = cm.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
}
4.
最后写测试Activity,xml布局文件比较简单,就不贴了
package com.jandar.test;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jandar.http.OnHttpRequest;
import com.jandar.puke.R;
import com.jandar.ui.BaseActivity;
public class MainActivity extends BaseActivity implements OnClickListener, OnHttpRequest {
private TextView _text;
private EditText _edit;
private Button _button;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
context = this;
initXML();
}
private void initXML() {
_text = (TextView) findViewById(R.id.text);
_edit = (EditText) findViewById(R.id.edit);
_button = (Button) findViewById(R.id.button);
_button.setOnClickListener(this);
setOnHttpRequest(this);
}
@Override
public void onClick(View v) {
getResult("");
}
@Override
public void httpNoInternet() {
_text.setText("当前无网络连接..");
}
@Override
public void httpStartLoad() {
_text.setText("正在加载,请稍候..");
}
@Override
public void httpError() {
_text.setText("加载出错了..");
}
@Override
public void httpResult(String result) {
_text.setText("处理的结果是: \n" + result);
}
}
核心思想就是通过java的接口回调机制来解决Android的非UI线程不能更新UI的问题
更多推荐
网络封装 android,Android Http网络请求封装
发布评论