实例1:
post(Runnable r)和post(Runnable r, long delayMillis),将指定Runnable(包装成PostMessage)加入到MessageQueue中,然后Looper不断从MessageQueue中读取Message进行处理。该用例只是new了Runable,但无Thread.start()的调用,因此并没有开启子线程
其中activity的代码如下:
public class MainActivity extends AppCompatActivity {
private TextView text_view = null;
private Button start = null;
private Button end = null;
Handler handler = new Handler();
Runnable send_msg_runable = new Runnable()
{
public void run()
{
text_view.append("\nreceive msg.");
handler.postDelayed(send_msg_runable, 2000);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_view = (TextView)findViewById(R.id.text_view);
start = (Button)findViewById(R.id.send);
end = (Button)findViewById(R.id.end);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//将线程接口立刻送到线程队列中
handler.post(send_msg_runable);
}
});
end.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(send_msg_runable);
}
});
}
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/send"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Send Msg"
/>
<Button
android:id="@+id/end"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Stop Send Msg"
/>
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="200dip"
android:text="msg"
tools:context=".MainActivity" />
</LinearLayout>
实例2:
public class MainActivity extends AppCompatActivity {
private ProgressBar progress_bar = null;
private Button start = null;
Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
progress_bar.setProgress(msg.arg1);
mHandler.post(mRunable);
}
};
Runnable mRunable = new Runnable()
{
int m = 0;
public void run() {
// TODO Auto-generated method stub
m += 10;
Message msg = mHandler.obtainMessage();
msg.arg1 = m;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
//发送消息
mHandler.sendMessage(msg);
if(m == 100)
//从线程队列中移除线程
mHandler.removeCallbacks(mRunable);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress_bar = (ProgressBar)findViewById(R.id.progress_bar);
start = (Button)findViewById(R.id.send_msg);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//让进度条显示出来
progress_bar.setVisibility(View.VISIBLE);
//将线程加入到handler的线程队列中
mHandler.post(mRunable);
}
});
}
}
布局如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="100dip"
android:layout_alignParentBottom="true"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="gone"
/>
<Button
android:id="@+id/send_msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="send msg"
/>
</RelativeLayout>
说明:该实例也没有开启子线程
实例3:
主线程和子线程各自拥有一个handler,双向通信,
通过Looper.myLooper()获取当前线程Looper,子线程需要调用Looper.prepare和Looper.loop初始化looper
UI线程通过getMainLooper获取主线程looper
Activity代码如下:
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private TextView mTextView;
private Handler1 mSubThreadHandler;
private Handler2 mMainThreadHandler;
private int counter=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
mTextView = (TextView) findViewById(R.id.text);
new Thread() {
public void run() {
Looper.prepare();
//Looper.myLooper()获取当前线程的looper
mSubThreadHandler=new Handler1(Looper.myLooper());
Message message = new Message();
message.obj = "子线程发送的消息";
//子线程给自己发消息
mSubThreadHandler.sendMessage(message);
Looper.loop();
};
}.start();
}
private class Handler1 extends Handler {
private Handler1(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//子线程解析消息
Log.d(TAG,"子线程收到:" + msg.obj);
//子线程发消息到主线程
mMainThreadHandler = new Handler2(getMainLooper());
Message message = new Message();
message.obj = "abc";
mMainThreadHandler.sendMessage(message);
}
}
private class Handler2 extends Handler {
private Handler2(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//主线程解析消息
mTextView.setText("主线程收到子线程消息:" + msg.obj);
//主线程发消息到子线程
if (counter==0) {
Message message = new Message();
message.obj = "主线程发送的消息mmm";
mSubThreadHandler.sendMessage(message);
counter++;
}
}
}
}
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
android:layout_centerInParent="true"
android:layout_marginTop="70dip" />
</RelativeLayout>
运行结果如下: