多线程中的交互:Handler
Handler :可以发送Message,和接收Message【通过message.what = 0来设置message的类型】
Message:可以放置Bundle【用于传送基本数据类型,String和实现了Serizlizable接口的应用类型】
1、将子线程中的数据通过handler发送到了handMessage方法中
import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
//在onCreate()方法中添加一条线程(子线程传递一个list到UI线程)
public class MainActivity extends Activity {
private Button btn_join;
private ArrayList<String> userList;
Message message =new Message();
Message message1 =new Message();
private int temp = 0;
Bundle bundle1 =new Bundle();
Handler handler =new Handler(){
//接收handler发过来的消息
@Override
public void handleMessage(Message msg) {
message1 = msg;
switch (msg.what) {
case 1://接收message.what==1的消息
btn_join.setText(temp+"");
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_join = (Button)findViewById(R.id.button1);
btn_join.setOnClickListener(new View.OnClickListener() {
/**
* 1.将实现Serializable的类User添加到ArrayList<User>的对象userList中
* 2.intent.putExtra("Users",userList);传递
*/
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this,Secound.class);
Bundle bundle = new Bundle();
intent.putExtra("Users",userList);
startActivity(intent);
}
});
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1;i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bundle1.putSerializable("user",userList);
message.setData(bundle1);//发送bundle
message.setTarget(handler);
message.what = 1;
handler.sendMessage(message);
temp++;
}
}
}).start();
}
}
2、使用Handler.post(Runnable runnable)
final Handler handler1 = new Handler();
new Thread(){//开启子线程
@Override
public void run() {
//子线程中执行
handler1.post(new Runnable() {
@Override
public void run() {
//执行Ui线程
}
});
}
}.start();
3、使用runUiThread(Runnable runnable)
new Thread(){
@Override
public void run() {
//子线程中执行
runOnUiThread(new Runnable() {
@Override
public void run() {
//Ui线程中执行
}
});
}
}.start();