Android中UI线程与后台线程交互方法

本文章为转载+自己总结修改。


方法一: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线程之间的交流。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值