android 界面刷新 post send

简介: 引用:http://blog.csdn.net/tianshuai11/article/details/7428411 一,问题引入        异常: Only the original thread that created a view hierarchy can touch its v...

引用:http://blog.csdn.net/tianshuai11/article/details/7428411

一,问题引入

       异常: Only the original thread that created a view hierarchy can touch its views的解决方案   

 

       为什么会有这种异常产生呢?
    
      当每个应用程序apk第一次启动时,Android会同时启动一个对应的 主线程(Main Thread)
      主线程负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,
      并把相关的事件分发到对应的组件进行处理,所以主线程通常又被叫做 UI线程
 
      但是在开发Android应用时必须遵守单线程模型的原则: 
       Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,如果在非UI线程中直接操作UI线程,
      会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that 
      created a view hierarchy can touch its views,这与普通的java程序不同。
 
       由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,
       UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,
       否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒 用户终止应用程序(ANP)
 
       如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,
       因此android采用一种的Message Queue机制保证 线程间通信
 
       Message Queue是一个消息队列,用来存放通过Handler发送的消息。
       Android在第一启动程序时会默认会为UI thread创建一个关联的消息队列,
      可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,
      activities,broadcast receivers 等,你可以在自己的子线程中创建Handler与UI thread通讯。
 
      Handler会向message queue通过两种方法发送消息:send或post。
      这两种消息都会插在message queue队尾并按先进先出执行,
      但通过这两种方法发送的消息执行的方式略有不同:
      1)通过send发送的是一个message对象, 会被handler的 handleMessage()函数处理;
      2)而通过post方法发送的是一个runnable对象,则会自己执行。
 
      每个带图形界面的应用启动后,都会创建一个主线程,可称之为UI线程。
      这个线程自动就会创建一个message queue,来自于系统的消息都会投放到这个message queue里面,
      并按先进先出的顺序处理。
 
      UI线程图形界面中的view可通过post方法向GUI线程的message queue投递一个runnable。
     对于除UI线程以外的其他线程,创建时缺省并没有message queue,
     而对于UI线程,则可以直接(比如在onCreate)创建一个handler并重载handleMessage,
     省去创建message queue的过程。
二,解决方案一
      
[html]  view plain copy
  1. final Handler handler = new Handler(){     
  2.         
  3.             @Override  
  4.         public void handleMessage(Message msg) {     
  5.     
  6.               
  7.             if(msg.what == 0)//成功     
  8.             {  
  9.                 Log.d(TAG, "**********************start****************************");  
  10.                 playVideo(strVideoPath);//包含更新界面的方法  
  11.                 Log.d(TAG, "***********************end*****************************");  
  12.             }  
  13.   
  14.                 
  15.         }   
  16.              
  17.     };     
  18.    
  19.     new Thread()   
  20.         {  
  21.             @Override  
  22.         public void run()  
  23.         {     
  24.                    // handler.post(runnableUi);     
  25.                           
  26.                     try{  
  27.                           
  28.                          Log.d(TAG, "######################start###############################");  
  29.                          handler.sendEmptyMessage(0);//UI线程外想更新UI线程  
  30.                          Log.d(TAG, "######################end###############################");  
  31.                     }  
  32.                catch(Exception e)  
  33.                    {  
  34.                        Log.d(TAG, "***************************"+e.toString());  
  35.                    }  
  36.                       
  37.          }  
  38.        }.start();  
[html]  view plain copy
  1. <strong><span style="font-size:18px;">三,解决方案二</span></strong>  
[html]  view plain copy
  1. <pre class="html" name="code">Runnable   runnableUi=new  Runnable(){    
  2.         @Override    
  3.         public void run() {    
  4.             //更新界面    
  5.             textView.setText("the Content is:"+content);    
  6.         }    
  7.             
  8.     };    
  9.   new Thread(){    
  10.                 public void run(){      
  11.                     content=df.downLoadFiles();         
  12.                     handler.post(runnableUi);     
  13.                     }                       
  14.             }.start();  


 
 四,特别注意,引入函数包得时候,不要引入错误的包 
 
 

 

             import android.os.Handler; //这是正确的包

             import java.util.logging.Handler;//不是这个包,而是上一个

相关文章
|
11月前
|
Android开发
定制Android关机界面
定制Android关机界面
170 0
|
6月前
|
XML 数据可视化 Android开发
Android应用界面
Android应用界面中的布局和控件使用,包括相对布局、线性布局、表格布局、帧布局、扁平化布局等,以及AdapterView及其子类如ListView的使用方法和Adapter接口的应用。
89 0
Android应用界面
|
7月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
565 9
|
7月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
170 1
|
9月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
【7月更文挑战第28天】随着移动应用市场的发展,用户对界面设计的要求不断提高。Material Design是由Google推出的设计语言,强调真实感、统一性和创新性,通过模拟纸张和墨水的物理属性创造沉浸式体验。它注重色彩、排版、图标和布局的一致性,确保跨设备的统一视觉风格。Android Studio提供了丰富的Material Design组件库,如按钮、卡片等,易于使用且美观。
301 1
|
8月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
223 0
|
9月前
|
XML Android开发 数据安全/隐私保护
使用RelativeLayout布局Android界面
使用RelativeLayout布局Android界面
|
11月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
1401 0
|
10月前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
9月前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
113 0

热门文章

最新文章

下一篇
oss创建bucket