我们都知道的事情是Android界面的更新只能在主线程总进行。但是,我非要通过子线程更新界面怎么样做呢。
朋友遇到的问题,他是学java后台的,突然对Android感兴趣,于是问我关于线程更新界面的问题:
我现在使用线程更新界面的方法有两个一是handler另外一个就是runOnMainThread,不过handler对与非常快的更新是不好的,容易造成线程滞后,也就是说这种方式只能适用在不是非常频繁的更新中使用的。
handler更新界面又可以根据两种方式来更新:Message和Runable,使用Message可以从子线程中传递一些参数给主线程,Handler获取这些信息并进行相应的处理。使用Runnable则可以直接执行某个处理结果。其实,这两者的实质都是在Handler的队列中放入内容,Handler会处理完一个消息或者执行完某个处理之后再进行下一步操作,这样就不会出现多个线程同时要求进行UI处理而引发混乱现象。
具体代码如下:
package com.example.androidui; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; public class MainActivity extends Activity { private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(mRunnable).start(); mText = (TextView) findViewById(R.id.text); } private Runnable mRunnable = new Runnable() { public void run() { while (true) { try { Thread.sleep(1000); mHandler.sendMessage(mHandler.obtainMessage()); } catch (InterruptedException e) { e.printStackTrace(); } } } }; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); update(); } private void update() { mText.setText("更新界面——handler"); } }; }而runOnMainThread更新界面非常简单,代码如下:
package com.example.androidui; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mText = (TextView) findViewById(R.id.text); MainActivity.this.runOnUiThread(new Runnable() { public void run() { mText.setText("更新界面-runOnUiThread") ; } }); } }