1.图解Thread-Handler-Message:
2.文字说明:
(1)Handler: 主线程申明。
(2)在子线程发消息:handler.sendMessage (message)。
Message: 2个重要的属性:a.what:消息类型。b.obj:消息的具体内容。
(3)在主线程接收消息:handler.handlerMessage (message)。
3.代码展示:以检查软件是否需要更新为例:(1)开辟子线程访问网络:new Thread(){ public void run(){ };} .start(); (2)发消息给handler处理: Handler handler = new Handler(){ handleMessage(Message msg){};};
public class MainActivity extends Activity {
public static final int MSG_SHOW_DIALOG = 1;
public static final int MSG_ENTER_HOME = 2;
public static final int MSG_WEB_ERROR = 3;
private int webVersionCode;
private String webAPKUrl;
private String webVersionDes;
private Handler handler = new Handler() {
// 在主线程处理消息
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SHOW_DIALOG:
// TODO showDialog()
break;
case MSG_ENTER_HOME:
// TODO enterHome()
break;
case MSG_WEB_ERROR:
// TODO enterHome()
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkUpdateAPK();
}
private void checkUpdateAPK() {
// 检查服务端是否有更新,相当于对网络进行访问:开启子线程访问
new Thread() {
@Override
public void run() {
long startTime = System.currentTimeMillis();
// 网络访问流程
Message msg = new Message();
try {
URL url = new URL("http://xxxxxxxx");
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
if (code == 200) {
// 连接服务器成功,则获取输入流,读取网络文件
InputStream is = conn.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
String webResult = reader.readLine();
// 对web数据进行解析
JSONObject jsonObject = new JSONObject(webResult);
webVersionCode = jsonObject.getInt("code");
webAPKUrl = jsonObject.getString("apkurl");
webVersionDes = jsonObject.getString("des");
// 拿到版本号之后,比较服务端和现有的把版本比较,如果web端的版本高于客户端
// 则弹出对话框询问是否升级
if (webVersionCode > getVersion()) {
// 调用对话框询问是是否更新
msg.what = MSG_SHOW_DIALOG;
} else {
// 服务端没有更新的apk,跳转到home界面
msg.what = MSG_ENTER_HOME;
// enterHome();
}
} else {
// 访问服务端有异常,也直接跳转到home界面
// enterHome();
msg.what = MSG_WEB_ERROR;
}
} catch (Exception e) {
msg.what = MSG_WEB_ERROR;
e.printStackTrace();
} finally {
// 访问网络需时间
long durationTime = System.currentTimeMillis() - startTime;
if (durationTime < 2000) {
// 继续休眠
SystemClock.sleep(2000 - durationTime);
}
// 6.向主线程发消息
handler.sendMessage(msg);
}
};
}.start();
}
private int getVersion() {
// 获取版本号
PackageManager packageManager = getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(
getPackageName(), PackageManager.GET_ACTIVITIES);
return packageInfo.versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return 0;
}
}
4.Thread-Handler-Message不足之处:
(1)每次访问网络,都需要开辟匿名线程,匿名线程不好管理
(2)有可能同时开辟多个子线程,在一个时间段开辟多个线程,会影响性能和体验。
AsyncTask也是子线程与主线程通信的一种方式,它对上述的不足进行了封装处理。