子线程更新主线程的方法有很多,在此我只罗列了我用到的两种,其他方法大家可以去询问度娘。
方法一
在子线程中直接利用此方法
new Handler(MainActivity.mainaction.getMainLooper()).post(new Runnable() { @Override public void run() {
//此处做更新ui处理 iv_wangka.setImageBitmap(ImageDealUtil.readBitMap(MainActivity.getMainaction(), R.mipmap.wifi_4, true)); } });
//若是在Active中也可用下面的这种方法
runOnUiThread(new Runnable() { @Override public void run() { mTvTest.setText("runOnUIThread"); } });
方法二
在子线程中利用Handler发送信息,然后利用Handerl接收消息通知主线程更新UI
package ispring.com.testhandler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements Button.OnClickListener { private TextView statusTextView = null; //uiHandler在主线程中创建,所以自动绑定主线程 private Handler uiHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case 1: System.out.println("handleMessage thread id " + Thread.currentThread().getId()); System.out.println("msg.arg1:" + msg.arg1); System.out.println("msg.arg2:" + msg.arg2); MainActivity.this.statusTextView.setText("文件下载完成"); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); statusTextView = (TextView)findViewById(R.id.statusTextView); Button btnDownload = (Button)findViewById(R.id.btnDownload); btnDownload.setOnClickListener(this); System.out.println("Main thread id " + Thread.currentThread().getId()); } @Override public void onClick(View v) { DownloadThread downloadThread = new DownloadThread(); downloadThread.start(); } class DownloadThread extends Thread{ @Override public void run() { try{ System.out.println("DownloadThread id " + Thread.currentThread().getId()); System.out.println("开始下载文件"); //此处让线程DownloadThread休眠5秒中,模拟文件的耗时过程 Thread.sleep(5000); System.out.println("文件下载完成"); //文件下载完成后更新UI Message msg = new Message(); //虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message //msg = Message.obtain(uiHandler); //msg = uiHandler.obtainMessage(); //what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别 //出不同的Message,以便我们做出不同的处理操作 msg.what = 1; //我们可以通过arg1和arg2给Message传入简单的数据 msg.arg1 = 123; msg.arg2 = 321; //我们也可以通过给obj赋值Object类型传递向Message传入任意数据 //msg.obj = null; //我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据 //msg.setData(null); //Bundle data = msg.getData(); //将该Message发送给对应的Handler uiHandler.sendMessage(msg); }catch (InterruptedException e){ e.printStackTrace(); } } } }