activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="30sp"
android:textColor="@android:color/holo_blue_bright"
android:text="Handler" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/textView"
android:layout_marginTop="20dp"
android:layout_alignLeft="@id/textView"
android:textSize="30sp"
android:textColor="@android:color/holo_blue_bright"
android:text="开始下载"/>
</RelativeLayout>
MainActivity
package com.etime.myproject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
public class MainActivity extends Activity {
private TextView mTextView;
private Button mButton;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init3();
}
//错误示例
private void init1(){
mTextView=(TextView)findViewById(R.id.textView);
mButton=(Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//执行下载
testDownload1();
}
});
}
/**
* 错误示例:在子线程中更新UI
* 报错信息:Only the original thread that created a view hierarchy can touch its views.
*/
public void testDownload1(){
new Thread(){
@Override
public void run() {
super.run();
//模拟下载
for(int i=0;i<=100;i++){
Log.i("TAG","已经下载"+i+"%");
if(i==100){
mTextView.setText("下载完毕");
}
}
}
}.start();
}
//----------------------------------------------------
//正确示例
private void init2(){
mTextView=(TextView)findViewById(R.id.textView);
mButton=(Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//执行下载
testDownload2();
}
});
mHandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.i("TAG","收到消息");
Log.i("TAG",msg.obj.toString());
//处理消息
int what=msg.what;
if(what==1){
String message=(String)msg.obj;
//更新UI
mTextView.setText(message);
}
}
};
}
//正确示例
public void testDownload2(){
new Thread(){
@Override
public void run() {
super.run();
//模拟下载
for(int i=0;i<=100;i++){
Log.i("TAG","已经下载"+i+"%");
if(i==100){
Message message=new Message();
message.what=1;
message.obj="下载完毕";
//发送消息
mHandler.sendMessage(message);
}
}
}
}.start();
}
//----------------------------------------------------
//正确示例
private void init3(){
//创建Handler
mHandler=new MyHandler();
mTextView=(TextView)findViewById(R.id.textView);
mButton=(Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启线程模拟下载
MyThread thread=new MyThread();
thread.start();
}
});
}
//MyHandler继承自Handler
private class MyHandler extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//处理消息
int what=msg.what;
if(what==1){
String message=(String)msg.obj;
//更新UI
mTextView.setText(message);
}
}
}
//下载线程
private class MyThread extends Thread{
@Override
public void run() {
super.run();
//模拟下载
for(int i=0;i<=100;i++){
Log.i("TAG","已经下载"+i+"%");
if(i==100){
Message message=new Message();
message.what=1;
message.obj="下载完毕";
//发送消息
mHandler.sendMessage(message);
}
}
}
}
}