【Android开发】Handler和多线程以及openOptionsMenu的使用。

知识点记录:OptionMenu.java

 

/*
测试点:
1.发现直接在OnResume中执行openOptionsMenu是不行的,原因是UI线程中不能执行这种长时间的操作。
2.使用Handler和HandlerThread去处理, 在另外的线程中去执行。
*/


public class MainActivity extends Activity {

	private final int Edit_ID = 1;
	private final int Delete_ID = 2;
	private TextView tv;
	private Button open_menu;
	private Activity host;
	private MotionEvent mEvent;
	private KeyEvent event;
	private Boolean flag = false;
	private myHandler mHandler;
	private HandlerThread ht;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i("ntb", "OnCreate");
		open_menu = (Button)findViewById(R.id.open_menu);
		ht = new HandlerThread("ht");
		ht.start();//开启一个处理Hanlder的线程
		Log.i("ntb", "run ok");
	}
	
	@Override
	public void openOptionsMenu() {
		// TODO Auto-generated method stub
		super.openOptionsMenu();
		Log.i("ntb", "openOptionsMenu");
	}
	
    //重载Handler类,构造一个带Looper参数的构造方法,以便通过getLooper和对应的线程绑定。
	public class myHandler extends Handler {
		public myHandler() {
			// TODO Auto-generated constructor stub
		}
		
		public myHandler(Looper looper) {
			// TODO Auto-generated constructor stub
			super(looper);
		}
		
		@Override
		public void handleMessage(Message msg) {//接收到Handler对象发来的数据后,就对msg进行处理
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			Bundle b = msg.getData();
			String action = b.getString("ActionOne");
			if (action == "openOptionsMenu") {
				openOptionsMenu();//在这里做openOptionMenu操作,实际就是在你绑定的线程中执行,已经不在主线程中
			}
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		Log.i("ntb", "OnResume");
		super.onResume();
//		openOptionsMenu();//无法直接执行,但却可以放在Button的监听中
		open_menu.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				openOptionsMenu();
			}
		});
		
		mHandler = new myHandler(ht.getLooper());//绑定相应的Handler对象和线程
		Message msg = mHandler.obtainMessage();//获取要发送的消息对象,对其进行处理,发给绑定的线程,执行handleMessage
		Bundle bmsg = new Bundle();
		bmsg.putString("ActionOne", "openOptionsMenu");
		msg.setData(bmsg);
		msg.sendToTarget();

	}
//	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.option_menu, menu);
		menu.add(0, Edit_ID, 0, "Edit");
		menu.add(0, Delete_ID, 0, "Delete");
		flag = true;
		return true;
	}

}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值