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

Android子线程中更新UI的3种方法

2018-01-12 11:10 381 查看
方法一:用Handler 

1、主线程中定义Handler: 

[java] view
plain copy

<span style="font-size:18px;">Handler mHandler = new Handler() {  

  

        @Override  

        public void handleMessage(Message msg) {  

            super.handleMessage(msg);  

            switch (msg.what) {  

            case 0:  

                //完成主界面更新,拿到数据  

                String data = (String)msg.obj;  

                  

                updateWeather();  

                textView.setText(data);  

                break;  

            default:  

                break;  

            }  

        }  

  

    };  

</span>  

2、子线程发消息,通知Handler完成UI更新: 

[java] view
plain copy

<span style="font-size:18px;">private void updateWeather() {  

          

          

        new Thread(new Runnable(){  

  

            @Override  

            public void run() {  

                //耗时操作,完成之后发送消息给Handler,完成UI更新;  

                mHandler.sendEmptyMessage(0);  

                  

                //需要数据传递,用下面方法;  

                Message msg =new Message();  

                msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  

                mHandler.sendMessage(msg);  

            }         

        }).start();       

    }</span>  

方法一的Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用; 

方法二:用Activity对象的runOnUiThread方法更新 

在子线程中通过runOnUiThread()方法更新UI: 

[java] view
plain copy

<span style="font-size:18px;">new Thread() {  

            public void run() {  

                //这儿是耗时操作,完成之后更新UI;  

                runOnUiThread(new Runnable(){  

  

                    @Override  

                    public void run() {  

                        //更新UI  

                        imageView.setImageBitmap(bitmap);  

                    }  

                      

                });  

            }  

        }.start();</span>  

如果在非上下文类中(Activity),可以通过传递上下文实现调用; 

[java] view
plain copy

Activity activity = (Activity) imageView.getContext();  

                activity.runOnUiThread(new Runnable() {  

  

                    @Override  

                    public void run() {  

                        imageView.setImageBitmap(bitmap);  

                    }  

                });  

这种方法使用比较灵活,但如果Thread定义在其他地方,需要传递Activity对象; 

方法三:View.post(Runnable r) 

[java] view
plain copy

<span style="font-size:18px;">imageView.post(new Runnable(){  

  

                    @Override  

                    public void run() {  

                        imageView.setImageBitmap(bitmap);  

                    }  

                      

                });</span>  

这种方法更简单,但需要传递要更新的View过去; 

方法四:AsyncTask

[java] view
plain copy

<span style="font-size:18px;">//UI线程中执行    

new DownloadImageTask().execute( "www.91dota.com" );    

private class DownloadImageTask extends AsyncTask {    

    protected String doInBackground( String... url ) {    

         return loadDataFormNetwork( url[0] );//后台耗时操作    

    }    

  

    protected void onPostExecute( String result ) {    

          myText.setText( result ); //得到来自网络的信息刷新页面     

  

   }    

}</span>  

总结:UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: