Android如何执行一个不确定当前处于在子线程还是主线程中的UI操作
2016-01-25 10:28
471 查看
由于Android不能在子线程中进行UI操作。而所有的访问网络,通过四大组件内容提供者查询等等操作大多数都在子线程中进行。在实际开发中开始时候开启一个子线程,什么阶段回调到主线程中执行代码大多数时候都是在程序员掌握之中的,而难免有时候会无法判断当前线程是主线程还是子线程。这篇文章教大家如何通过一个全局的Application来获取主线程的id值来于你要判断的线程的id进行比较来确定当前线程处于什么线程。
定义一个Application:
别忘了在清单文件中声明(额,废话)
在你要执行的代码中进行判断:
这样就完成了判断代码是处于子线程还是主线程。通过观察我们可以看到BaseApplication中还存在一个Handler
执行某个无法判断是在主线程还子线程的UI操作:
声明一个工具类UiUtils:
执行一个UI操作:
注:在Android开发中声明一个全局的Application中通常的做法。
定义一个Application:
[code]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; } }
别忘了在清单文件中声明(额,废话)
在你要执行的代码中进行判断:
[code]boolean isUiThread = android.os.Process.myTid()==BaseApplication.getMainId(); //true表示主线程,false表示子线程
这样就完成了判断代码是处于子线程还是主线程。通过观察我们可以看到BaseApplication中还存在一个Handler
执行某个无法判断是在主线程还子线程的UI操作:
声明一个工具类UiUtils:
[code]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操作:
[code]//执行在UiUtils中定义的runOnUiThread方法 UiUtils.runOnUiThread(new Runnable() { @Override public void run() { //UI操作 } });
注:在Android开发中声明一个全局的Application中通常的做法。
相关文章推荐
- UIPageViewController浅析
- 介绍MSAA,UIA ,Windows Automation API
- 在使用easyui,datagrid时,JSON中的如果含有换行符,则不能显示数据
- 一、使用系统自带UIRefreshControl进行下拉刷新
- MS UI Automation简介
- iOS开发笔记--关于设置UIView的背景为图片的方法以及问题
- UE4 代码编写细节:静态变量
- UITabelViewFootView(转)
- 使用WebRequest对象调用新浪天气预报<转>
- 《iOS Human Interface Guidelines》——Accessing User Data
- C#:使用WebRequest类请求数据
- UIImagePickerController 文字英文状态修改为中文
- 有限差分法Eluer算法(求解常微分方程)
- request 获取请求参数
- Request Header在网页端和API中的区别与联系
- UICollectionViewController既有headerView又有footerView。
- 安装配置Jira和Confluence集成环境
- Mac安装mosquitto错误
- *Maximum Length Palindromic Sub-Sequence of an Array.
- UIScrollView的属性总结