由于Android不能在子线程中进行UI操作。而所有的访问网络,通过四大组件内容提供者查询等等操作大多数都在子线程中进行。在实际开发中开始时候开启一个子线程,什么阶段回调到主线程中执行代码大多数时候都是在程序员掌握之中的,而难免有时候会无法判断当前线程是主线程还是子线程。这篇文章教大家如何通过一个全局的Application来获取主线程的id值来于你要判断的线程的id进行比较来确定当前线程处于什么线程。
定义一个Application:
public class BaseApplication extends Application{
private static BaseApplication application;
//主线程的id
private static int mainId;
//对外提供Handler
private static Handler handler;
@Override
public void onCreate() {
super.onCreate();
application = this;
mainId = android.os.Process.myTid();
handler = new Handler();
}
//对外获取Context
public static Context getAppliction(){
return application;
}
//获取主线程的id
public static int getMainId() {
return mainId;
}
//获取Handler
public static Handler getHandler() {
return handler;
}
}
别忘了在清单文件中声明(额,废话)
在你要执行的代码中进行判断:
boolean isUiThread = android.os.Process.myTid()==BaseApplication.getMainId();
//true表示主线程,false表示子线程
这样就完成了判断代码是处于子线程还是主线程。通过观察我们可以看到BaseApplication中还存在一个Handler
执行某个无法判断是在主线程还子线程的UI操作:
声明一个工具类UiUtils:
public class UiUtils{
//定义一个方法 runOnUiThread
public static void runOnUiThread(Runnable runnable) {
//根据当前是在主线程还是子线程执行不同的操作
if(android.os.Process.myTid()==BaseApplication.getMainId()){
//在主线程中直接运行即可
runnable.run();
}else{
//说明在子线程中,通过handler的post来执行
BaseApplication.getHandler().post(runnable);
}
}
}
执行一个UI操作:
//执行在UiUtils中定义的runOnUiThread方法
UiUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
//UI操作
}
});
注:在Android开发中声明一个全局的Application中通常的做法。