子线程通过handler去影响主线程的布局文件
/**
* 线程间消息传递
* Handler进行消息传递
* 1、主线程中定故意Handler对象,赋值消息的处理,handlerMessage()
* 2、子线程中handler.sendMessage(Message)
*
*/
在主线程中倒计时5s,然后跳转界面,或者应用
第一种消息处理方式
private Handler handler=new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 1:
progressBar.setVisibility(View.GONE);
break;
case 2:
int i=msg.arg1;
if (i==0){
//启动另一个应用
ComponentName componentName = new ComponentName("com.hfzy.mytext0728",
"com.hfzy.mytext0728.activity.YindaoActivity");
// Intent intent=new Intent(BGActivity.this, MainActivity.class);
Intent intent=new Intent();
intent.setComponent(componentName);
startActivity(intent);
finish();
}else {
textView.setText(i+"s");
}
break;
}
}
} ;
private void tvTime() {
//创建线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i=5;i>=0;i--){
//第一种方法
//handler: sentMessageAtTime()
Message msg=handler.obtainMessage();
msg.what=2;
msg.arg1=i;
handler.sendMessage(msg);
try {
Thread.sleep(1000);//休息1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
在子线程中不能直接改变主线程的布局插件等
private void doStart() {
//创建线程消息
new Thread(new Runnable() {
@Override
public void run() {
//xml资源文件下的音频使用方法
player=MediaPlayer.create(BGActivity.this,R.raw.pp);//xml资源文件下的音频
player.start();//启动
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
//子线程中,handler.sendMessage()
handler.sendEmptyMessage(1);
//不建议new Message()
// Message msg=new Message();
// msg.arg1=1;
// msg.arg2=2;
// Bundle bundle=new Bundle();
// msg.obj=bundle;
Message msg=handler.obtainMessage();//或者message.obtain()
handler.sendMessage(msg);
}
});
// progressBar.setVisibility(View.GONE);//子线程不能影响主线程的插件
}
}).start();
}
}
第二种方法
private void tvTime() {
//创建线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i=5;i>=0;i--){
try {
Thread.sleep(1000);//休息1s
} catch (InterruptedException e) {
e.printStackTrace();
}
//第二种方法
//通过 handler.post(Runnable)方法
final int count=i;
handler.post(new Runnable() {
@Override
public void run() {
//在主线中完成
textView.setText(count+"s");
}
});
}
//循环结束,跳转界面
Intent intent=new Intent(BGActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}).start();
}
第三种方式
private void tvTime() {
//创建线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i=5;i>=0;i--){
try {
Thread.sleep(1000);//休息1s
} catch (InterruptedException e) {
e.printStackTrace();
}
//第三种方法
final int count=i;
runOnUiThread(new Runnable() {
@Override
public void run() {
//在主线中完成
textView.setText(count+"s");
}
});
}
//循环结束,跳转界面
Intent intent=new Intent(BGActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}).start();
}