@Override public void run() { Looper.prepare(); Looper myLooper = Looper.myLooper(); Looper mainLooper = Looper.getMainLooper(); String msgobj; if (null == myLooper) { mOwnLooperThreadHandler = new EventHandler(mainLooper); msgobj = "OwnLooperThread has no looper and handleMessage function executed in main thread!"; } else { mOwnLooperThreadHandler = new EventHandler(myLooper); msgobj = "This is from OwnLooperThread self and handleMessage function executed in NoLooperThread!"; } mOwnLooperThreadHandler.removeMessages(0); // 给自己发送消息 Message msg = mOwnLooperThreadHandler.obtainMessage(3, 1, 1, msgobj); mOwnLooperThreadHandler.sendMessage(msg); Looper.loop(); }
@Override public void run() { Looper myLooper = Looper.myLooper(); Looper mainLooper = Looper.getMainLooper(); String msgobj; if (null == myLooper) { // 这里获得的是主线程的Looper,由于NoLooperThread没有自己的looper所以这里肯定会被执行 mNoLooperThreadHandler = new EventHandler(mainLooper); msgobj = "NoLooperThread has no looper and handleMessage function executed in main thread!"; } else { mNoLooperThreadHandler = new EventHandler(myLooper); msgobj = "This is from NoLooperThread self and handleMessage function executed in NoLooperThread!"; } mNoLooperThreadHandler.removeMessages(0); if (bpostRunnable == false) { // send message to main thread Message msg = mNoLooperThreadHandler.obtainMessage(2, 1, 1, msgobj); mNoLooperThreadHandler.sendMessage(msg); Log.e(TAG, "NoLooperThread id:--------+>" + this.getId()); } else { // 下面new出来的实现了Runnable接口的对象中run函数是在Main Thread中执行,不是在NoLooperThread中执行 记得 null == myLooper么 // 注意Runnable是一个接口,它里面的run函数被执行时不会再新建一个线程 // 您可以在run上加断点然后在eclipse调试中看它在哪个线程中执行 mNoLooperThreadHandler.post( new Runnable() { public void run() { // TODO Auto-generated method stub tv.setText("update UI through handler post runnalbe mechanism!"); Log.e(TAG, "update UI id:--------+>" + Thread.currentThread().getId()); noLooperThread.stop(); } }); } }
private void updateCacheStatus(int type, int info, long[] segments) { if (mEventHandler != null) { Message m = mEventHandler.obtainMessage(MEDIA_CACHING_UPDATE); Bundle b = m.getData(); b.putInt(MEDIA_CACHING_TYPE, type); b.putInt(MEDIA_CACHING_INFO, info); b.putLongArray(MEDIA_CACHING_SEGMENTS, segments); mEventHandler.sendMessage(m); } }
public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case 101: // 主线程发送消息给自己 Looper looper = Looper.myLooper(); // get the Main looper related with the main thread // 如果不给任何参数的话会用当前线程对应的Looper(这里就是Main Looper)为Handler里面的成员mLooper赋值 mHandler = new EventHandler(looper); // 清除整个MessageQueue里的消息 mHandler.removeMessages(0); String obj = "This main thread's message and received by itself!"; Message msg = mHandler.obtainMessage(1, 1, 1, obj); // 将Message对象送入到main thread的MessageQueue里面 mHandler.sendMessage(msg); break; case 102: // other线程发送消息给主线程 bpostRunnable = false; noLooperThread = new NoLooperThread(); noLooperThread.start(); break; case 103: // other thread获取它自己发送的消息 tv.setText("please look at the error level log for other thread received message"); ownLooperThread = new OwnLooperThread(); ownLooperThread.start(); break; case 104: // other thread通过Post Runnable方式发送消息给主线程 bpostRunnable = true; noLooperThread = new NoLooperThread(); noLooperThread.start(); break; case 105: // 主线程发送消息给other thread if (null != mOtherThreadHandler) { tv.setText( "please look at the error level log for other thread received message from main thread"); String msgObj = "message from mainThread"; Message mainThreadMsg = mOtherThreadHandler.obtainMessage(1, 1, 1, msgObj); mOtherThreadHandler.sendMessage(mainThreadMsg); } break; case 106: finish(); break; } }
private void updateSub(int subType, byte[] bytes, String encoding, int width, int height) { if (mEventHandler != null) { Message m = mEventHandler.obtainMessage(MEDIA_TIMED_TEXT, width, height); Bundle b = m.getData(); if (subType == SUBTITLE_TEXT) { b.putInt(MEDIA_SUBTITLE_TYPE, SUBTITLE_TEXT); if (encoding == null) { b.putString(MEDIA_SUBTITLE_STRING, new String(bytes)); } else { try { b.putString(MEDIA_SUBTITLE_STRING, new String(bytes, encoding.trim())); } catch (UnsupportedEncodingException e) { Log.e("updateSub", e); b.putString(MEDIA_SUBTITLE_STRING, new String(bytes)); } } } else if (subType == SUBTITLE_BITMAP) { b.putInt(MEDIA_SUBTITLE_TYPE, SUBTITLE_BITMAP); b.putByteArray(MEDIA_SUBTITLE_BYTES, bytes); } mEventHandler.sendMessage(m); } }