Launcher中 Handler的使用
来源:互联网 发布:242家网络小额贷款牌照 编辑:程序博客网 时间:2024/06/07 09:57
Launcher中Handler类使用的比较频繁,特别是LauncherModel类中,主要用于对数据库的更改。
下面重点看下LauncherModel中Handler对数据的操作。
源码一:
private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader");static {sWorkerThread.start();}private static final Handler sWorker = new Handler(sWorkerThread.getLooper());
此处需要注意的是Handler必须通过带有Looper参数的构造函数来定义;
调用HandlerThread之前,HandlerThread必须要先调用start方法。
源码二:
static void deleteItemFromDatabase(Context context, ItemInfo item) { final ContentResolver cr = context.getContentResolver(); final Uri uriToDelete = LauncherSettings.Favorites.getContentUri(item.id, false); sWorker.post(new Runnable() { public void run() { cr.delete(uriToDelete, null, null); } }); }
上个方法是从数据库中删除数据
以上就是Launcher源码中对Handler的使用,接下来就要说为什么需要这样使用了
一:首先新建一个项目:
二:TestHandlerActivity.java代码如下
public class TestHandlerActivity extends Activity {public static final String TAG = "TestHandlerActivity";private Button startButton1 = null;private Button endButton1 = null;private Button startButton2 = null;private Button endButton2 = null;Handler handler = new Handler();private static HandlerThread mHandlerThread = new HandlerThread("handler_thread");static{mHandlerThread.start();}Handler myHandler = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.v(TAG, "onCreate ThreadId : " + Thread.currentThread().getId()); //此处为第一种方法开启线程,与主线程属同一线程 startButton1 = (Button)findViewById(R.id.startButton1); endButton1 = (Button)findViewById(R.id.endButton1); startButton1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//此时只是调用updateThread的run方法handler.post(updateThread);}}); endButton1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);}}); //此处为第二种方法开启线程,与主线程不是同一线程 startButton2 = (Button)findViewById(R.id.startButton2); endButton2 = (Button)findViewById(R.id.endButton2); startButton2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {myHandler = new Handler(mHandlerThread.getLooper());myHandler.post(updateThread2);}}); endButton2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {myHandler.removeCallbacks(updateThread2);}}); } Runnable updateThread = new Runnable(){@Overridepublic void run() {Log.v(TAG, "run() ThreadId : " + Thread.currentThread().getId());handler.postDelayed(updateThread, 3000);} }; Runnable updateThread2 = new Runnable(){@Overridepublic void run() {Log.v(TAG, "run() ThreadId : " + Thread.currentThread().getId());myHandler.postDelayed(updateThread2, 3000);} };}
效果图如下:
当点击第一组开启线程和关闭线程button时打印Log如下:
可以看到同属一个线程
当点击第二组开启线程和关闭线程button时打印Log如下:
可以看到不属于主线程,所以第二种方法更加适用于对数据库的操作和网络间的通讯
- Launcher中 Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Activity中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中Handler的使用
- android中handler的使用
- android中handler的使用
- Android中Handler的使用
- Android中Handler的使用
- Android中handler的使用
- Android 中 Handler 的使用
- Android中Handler的使用
- 完全卸载sql server2008
- 高级套接字函数 fcntl 设置socket 非阻塞
- 检测C++的内存泄漏
- 字符设备驱动实验
- Java程序员从笨鸟到菜鸟之(六十一)细谈Hibernate(十二)hibernate查询排序组件映射
- Launcher中 Handler的使用
- expdp错误ORA-39029
- ACE操作配置文件
- 上海偶游
- [mark]SCSI mode pages& SCSI Mode Sense Command
- rtf format statment
- Windows RPC远程过程调用(2): 返回整数和整数数组
- android 执行sql的长度限制
- java.lang.IllegalArgumentException: The observer is null.