Launcher中 Handler的使用

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值