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() {
@Override
public void onClick(View v) {
//此时只是调用updateThread的run方法
handler.post(updateThread);
}
});
endButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(updateThread);
}
});
//此处为第二种方法开启线程,与主线程不是同一线程
startButton2 = (Button)findViewById(R.id.startButton2);
endButton2 = (Button)findViewById(R.id.endButton2);
startButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myHandler = new Handler(mHandlerThread.getLooper());
myHandler.post(updateThread2);
}
});
endButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myHandler.removeCallbacks(updateThread2);
}
});
}
Runnable updateThread = new Runnable(){
@Override
public void run() {
Log.v(TAG, "run() ThreadId : " + Thread.currentThread().getId());
handler.postDelayed(updateThread, 3000);
}
};
Runnable updateThread2 = new Runnable(){
@Override
public void run() {
Log.v(TAG, "run() ThreadId : " + Thread.currentThread().getId());
myHandler.postDelayed(updateThread2, 3000);
}
};
}
效果图如下:
当点击第一组开启线程和关闭线程button时打印Log如下:
可以看到同属一个线程
当点击第二组开启线程和关闭线程button时打印Log如下:
可以看到不属于主线程,所以第二种方法更加适用于对数据库的操作和网络间的通讯