Android 对网络访问的封装

Android有俩个原则:

    主线程(UI线程)不能访问网络,子线程不能更改UI界面。


所以为了实现访问完网络后对界面  的更改 (比如加载图片,登录获取),Android有主要有俩种方式:


 

1 Thread  —— handler 实现  :

  Handler 作为主线程里面的处理者,当子线程发送消息过来时,执行dispatchMessage()方法。也就是当子线程获得数据后,发送消息给handler,hander对消息进行处理更改界面。其中消息就是 Message 类 可以拥有多个参数,what arg1 ,arg2,等参数。

 

package com.jju.ui;


import java.io.IOException;
import java.net.URISyntaxException;

import com.jju.net.HttpUtil;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.os.Handler;

public class TestThreadActivity extends Activity{
	public static final int MSG_RESULT = 11;
	public static final int MSG_ERROR = 22;
	private String result;
	Handler handler = new Handler(){
		public void dispatchMessage(android.os.Message msg) {
			if( msg.what == MSG_RESULT){
				showDialog(result);
			}else{
				showDialog("访问异常");
			}
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		new Thread(){
		public void run() {
			   try {
				result = HttpUtil.requestByConnect("http://www.baidu.com");
				handler.sendEmptyMessage(MSG_RESULT);
			} catch (IOException e) {
				e.printStackTrace();
				handler.sendEmptyMessage(MSG_ERROR);
			}
		   };
		}.start();
	}
	
	
	public void showDialog(String result) {
		AlertDialog builder = new Builder(getBaseContext()).setMessage(result)
				.setTitle("结果").setNegativeButton("确认", null).show();
	}

}

2 利用异步任务类处理

 关于异步类:异步任务主要通过实例化AsyncTask类来实现,该类有三个接口,doInBackground,该函数是任务的主体部分,将耗时的操作可以放在这里;onProgressUpdate是由系统回调的函数,当doInBackground主体中调用了publishProgress后,则会进入onProgressUpdate更新当前任务的状态,因此,在这里可以通过本类定义的TaskStateListener将状态传递给外界(调用者);而onPostExecute则是在doInBackground主体任务return(结束)后由系统回调。

package com.jju.ui;


import java.io.IOException;

import com.jju.net.HttpUtil;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.AsyncTask;
import android.os.Bundle;

public class TestThreadActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	    new GetHtmlTask().execute("http://www.baidu.com/");
	}
	
	
	public void showDialog(String result) {
		AlertDialog builder = new Builder(getBaseContext()).setMessage(result)
				.setTitle("结果").setNegativeButton("确认", null).show();
	}
	
	class GetHtmlTask extends AsyncTask<String, Void, String>{
		@Override
		protected String doInBackground(String... params) {
			String url = params[0];
			String htmlStr = null;
			try {
				htmlStr = HttpUtil.requestByConnect("http://www.baidu.com");
			} catch (IOException e) {
				e.printStackTrace();
			}
			return htmlStr;
		}
		
		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			showDialog(result);
		}
	}
}

上面俩个最简单的俩个: showDialog(str) 代表界面更改  requestByConnect(url) 代表网络访问。 

所以 AsyncTask 使用简单方便,代码简洁 doBackground代表后台操作,返回给方法onPostExecute()得到结果更改前台UI。而handler——thread 适用于复杂的网络获取,一个handler与多个thread沟通协作。



 





 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值