在非Activity(非主线程)中更新UI的办法:(一)Handler+Thread+Activity静态成员变量

来源:互联网 发布:支持向量回归算法 编辑:程序博客网 时间:2024/05/22 07:50

先介绍第一种方法,直接通过Handler对象更新UI,比较投机取巧,但是也能用。

1、在Activity中自定义ViewHandler,在ViewHandler中对UI进行处理,

class ViewHandler extends Handler {public ViewHandler() {}// TODO Auto-generated constructor stub@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);bar.setProgress(msg.arg1);}}

但是ViewHandler的声明必须放在主线程中,比如OnCreate方法中,通过Activity的instance对象去得到Handler,


public class MainActivity extends Activity {ViewHandler handler = new ViewHandler();public static MainActivity instance;public ViewHandler getHandler() {return handler;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bar = (ProgressBar) findViewById(R.id.progress_horizontal);//得到一个静态成员变量,需要在onDestroy方法中释放,不然有可能内存泄漏this.instance = this;}

在非Activity中如果要更新UI,可以通过如下方式,需要另起一个线程,否则会报ANR

public class OperProgress {public void setPro() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubint i = 0;while (i < 100) {i++;try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Message msg = new Message();msg.arg1 = i;<span style="white-space:pre"></span>//通过静态成员变量得到ViewHandler,从而更新UIMainActivity.instance.getHandler().sendMessage(msg);}}});thread.start();}}



0 0