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如下:

可以看到不属于主线程,所以第二种方法更加适用于对数据库的操作和网络间的通讯

原创粉丝点击