0x0 前言
一般在Android系统版本2.2以后,禁止在UI线程(主线程)访问网络。我们要把访问网络等耗时任务放在其他线程中,例如Android 线程之Thread 中介绍的那样,也可以像博文Android Handler与Thread 介绍的那样。
0x1 概述
Android是基于消息驱动的,消息的分发由Looper类负责,HandlerThread类是Looper的封装类,通过它可以创建Looper类的对象,进而创建一个用于处理耗时任务的线程或者取得UI线程。
0x3 上代码
/**
* 下面代码只是用于演示
*/
public class MainActivity extends ActionBarActivity implements Handler.Callback {
public static final int LOGIN = 0x1;
public static final int LOGIN_SUCCESS = 0x2;
private Handler mainHandler;
private Handler otherHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
//取得用于处理主线程消息的Handler对象
mainHandler = new Handler(getMainLooper(), this);
HandlerThread handlerThread = new HandlerThread("nouiThread");
//建立用于处理耗时线程消息的Handler对象,比如网络访问
otherHandler = new Handler(handlerThread.getLooper(), this);
}
/**
* 登陆按钮事件
*/
public void loginServer(View view) {
otherHandler.sendEmptyMessage(LOGIN);
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case LOGIN:
mainHandler.sendEmptyMessage(LOGIN_SUCCESS);
break;
case LOGIN_SUCCESS:
Toast.makeText(this, "Success", Toast.LENGTH_LONG).show();
break;
}
return false;
}
}