您的位置:首页 > 产品设计 > UI/UE

AndroidUI——后台线程更新UI的几种方式

2016-04-12 12:20 459 查看
开发Android程序时经常会用到后台线程请求服务器数据,当请求完数据后更新UI时,经常遇到回调函数中和UI相关的语句无法执行,甚至有时候会抛异常。

下面的例子我会讲到三种方法更新UI,例子非常简单,一个Activity和一个后台线程,在Activity中启动后台线程并把自己作为参数传给后台线程,后台线程每隔4秒调用Activity的showToast()方法一次,在showToast()方法中显示Toast。

MainActivity.java

package com.windanran.testtoast;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.widget.Toast;
import android.annotation.SuppressLint;
import android.app.Activity;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

new MyThread(this).start();
}

/*****************************方法一**********************************/
@SuppressLint("HandlerLeak")
/*private Handler handler1 = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
};
public void showToast()
{
handler1.sendEmptyMessage(0);
}*/
/*****************************方法一**********************************/

/*****************************方法二**********************************/
/*private Handler handler2 = new Handler();
public void showToast()
{
handler2.post(new Runnable()
{
@Override
public void run()
{
Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show();
}
});
}*/
/*****************************方法二**********************************/

/*****************************方法三**********************************/
public void showToast()
{
new Handler(Looper.getMainLooper()).post(new Runnable()
{
@Override
public void run()
{
Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show();
}
});
}
/*****************************方法三**********************************/

@Override
public void onBackPressed() {
Process.killProcess(Process.myPid());
super.onBackPressed();
}
}

MyThread.java
package com.windanran.testtoast;

public class MyThread extends Thread{

private MainActivity activity = null;
private boolean b = true;

public MyThread(MainActivity activity)
{
this.activity = activity;
}

@Override
public void run()
{
while(b)
{
try
{
Thread.sleep(4000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}

activity.showToast();
}
super.run();
}
}

需要注意的是:方法一和方法二Handler的初始化必须在主线程中,否则会抛异常,方法三的Handler可以不在主线程中初始化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ui 线程