Android——跨线程更新UI,Message,Handler
介绍
Android中UI组件只能在主线程进行更新。
因此,从其他线程无法操作UI组件更新网络数据。而 Handler ,Message,就是用于线程直接传递消息
Message:在handler和子线程之间传递数据(handler在主线程)
Handler:发送Message,处理Message。 使用Handler可将子线程的数据通过Message发送到主线程中,再通过handleMessage()进行处理。
属性
Message
arg1:int变量,存储数据
arg2:int变量,存储数据
what:int变量,区别消息类型
object:Object类,存储对象
方法
( Message )
Message obtain();
参数:无
返回值:Meesage对象
返回值意义:生成Message对象
作用:可获取一个Message对象
( Handler )
boolean sendMessage( Message message )
参数:
Message message:消息对象
返回值:boolean
返回值意义:是否发送成功
作用:发送消息对象到主线程中由handler处理
void handleMessage( Message message )
参数:
Message message:回调的消息对象
返回值:无
返回值意义:wu
作用:处理回调的消息对象。
使用
1. 生成内部类 MHandler 继承 Handler ,重写 handleMessage(Message message) 方法。根据message.what分类处理
2.在子线程中生成Message对象,记录标识what ,携带数据arg1
3. 通过handler.sendMessage(Message message) 发送数据
1
public class SecondActivity extends AppCompatActivity { private ProgressBar progressBar; private MHandler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); mHandler = new MHandler(); progressBar = this.findViewById(R.id.pb); Thread thread = new Thread(new Runnable() { @Override public void run() { int count = 0; while ( count < 100){ count++; Message message = Message.obtain(); message.what = 10; message.arg1 = count; mHandler.sendMessage(message); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }); thread.start(); } class MHandler extends Handler{ @Override public void handleMessage(@NonNull Message msg) { switch ( msg.what ){ case 10: progressBar.setProgress(msg.arg1); break; case 20: break; } } } }

浙公网安备 33010602011771号