p54.java
package com.jing.example.nknu_.p54;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import java.util.Random;
public class p54 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_p54);
}
public class ConsumeAndQuitThread extends Thread implements MessageQueue.IdleHandler{
private static final String THREAD_NAME = "ConsumeAndQuitThread";
public Handler mConsumeHandler;
private boolean mIsFirstIdle = true;
public ConsumeAndQuitThread(){
super(THREAD_NAME);
}
@Override
public void run(){
Looper.prepare();
mConsumeHandler=new Handler(){
@Override
public void handleMessage(Message msg){
System.out.println("System.out.println*************************進入handleMessage"+ " ThreadID=" + Thread.currentThread().getId());
}
};
System.out.println("System.out.println*************************離開handleMessage"+ " ThreadID=" + Thread.currentThread().getId());
//在背景執行緒啟動時,在上面註冊IdleHandler,另外,Looper被準備好(prepared),MessageQueue也因而被建立
Looper.myQueue().addIdleHandler(this);
Looper.loop();
}
@Override
public boolean queueIdle(){
if(mIsFirstIdle){//讓一個queueIdle調用通過,因為它發生在第一個訊息被收到之前。
mIsFirstIdle = false;
return true;//在第一個調用時回傳true,所以IdleHandler還是被註冊的
}
System.out.println("System.out.println *************************************************" + "Thread is end before" + " ThreadID=" + Thread.currentThread().getId());
mConsumeHandler.getLooper().quit();//終止該執行緒
System.out.println("System.out.println *************************************************" + "Thread is end after" + " ThreadID=" + Thread.currentThread().getId());
return false;
}
public void enqueueData(int i ){
System.out.println("System.out.println *************************************************" + i + " ThreadID=" + Thread.currentThread().getId());
mConsumeHandler.sendEmptyMessage(i);
}
}
public void Start(View v){
final ConsumeAndQuitThread consumeAndQuitThread = new ConsumeAndQuitThread();
consumeAndQuitThread.start();
for(int i=0; i < 10; i++){
new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i<5;i++){
SystemClock.sleep(new Random().nextInt(10));
consumeAndQuitThread.enqueueData(i);
}
}
}).start();
}
}
}
content_p54.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.jing.example.nknu_.p54.p54"
tools:showIn="@layout/activity_p54">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginStart="34dp"
android:layout_marginTop="130dp"
android:onClick="Start" />
</RelativeLayout>