本文章为转载+自己总结修改。
方法一:handler
handler是android中专门用来在线程之间传递信息类的工具。网上说得太多了,就不举例了。
方法二:Activity.runOnUIThread(Runnable)
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新 ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI 线程
例子:在UI线程中开子线程,在子线程中调用runOnUIThread实现界面每五秒换一个文字。
public class ThreadExample extends Activity {
protected int splashTime = 3000;
TextView tv1;
String[] name = {"A","N","D","R","O","I","D"};
int timer =0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1 = (TextView) findViewById(R.id.textView1);
Thread th=new Thread(){
@Override
public void run(){
try
{
for (timer = 0; timer < 7; timer++)
{
int waited = 0;
while(waited < splashTime)
{
Thread.sleep(100);
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
tv1.setText(name[timer]);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
waited += 100;
}
}
}catch (InterruptedException e) {
}
}
};
th.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
方法三:View.Post(Runnable)或View.PostDelayed(Runnabe,long)
该方法和方法二基本相同,只是在后台线程中能操控的UI控件被限制了,只能是指定的UI控件View。方法如下
1、编写后台线程,这回你可以直接调用UI控件,但是该UI控件只能是View
2、创建后台线程的实例
3、调用UI控件View的post方法,将后台线程实例作为参数传入其中。
具体来说,这个函数的工作原理如下:
View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
imageView.post(new Runnable(){
@Override
public void run() {
frameAnim.start();
}
});
方法四:AsyncTask
AsyncTask是一个专门用来处理后台进程与UI线程的工具。通过AsyncTask,我们可以非常方便的进行后台线程和UI线程之间的交流。