知识点记录: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;
}
}