Android Http网络请求封装

来源:互联网 发布:不亦说乎 不亦悦乎 编辑:程序博客网 时间:2024/05/22 17:42

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;}@Overridepublic 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.net.ConnectivityManager;import android.net.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() {@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {getResult("http://www.baidu.com");}@Overridepublic void httpNoInternet() {_text.setText("当前无网络连接..");}@Overridepublic void httpStartLoad() {_text.setText("正在加载,请稍候..");}@Overridepublic void httpError() {_text.setText("加载出错了..");}@Overridepublic void httpResult(String result) {_text.setText("处理的结果是: \n" + result);}}
核心思想就是通过java的接口回调机制来解决Android的非UI线程不能更新UI的问题


0 0
原创粉丝点击