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沟通协作。