安卓问题总结二(更新UI出现的问题)

今天测试视频资讯客户端,跟新UI是 LogCat 控制台出现了这样的错误:Only the original thread that created a view hierarchy can touch its views.  网上搜了一下才发现:原来android中相关的view和控件不是线程安全的,我们必须单独做处理。所以这里再次用到了Handler这个类来操作。到这里我才认识到(后知后觉) 原来自己前面已经使用过这种方式来跟新UI的操作。没想到这里就给忘了。这里记录下 省以后再忘记:

代码如下:

//Handler的使用跟新UI

final Handler handler = new Handler(){

public void handleMessage(Message msg){

switch (msg.what) {

case 0:

listView.setAdapter(adapter);

break;

default:

Toast.makeText(getApplicationContext(), R.string.error, 1)

.show();

break;

}

}

};

//使用线程加载数据

new Thread(new Runnable() {

@Override

public void run() {

try {

List<Video> videos = VideoService.getAll();//需修改成你本机的Http请求路径

List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();

for(Video video : videos){

System.out.println("---------------------------------------==="+video);

HashMap<String, Object> item = new HashMap<String, Object>();

item.put("id", video.getId());

item.put("name", video.getName());

item.put("time", getResources().getString(R.string.timelength)

+ video.getTimelength()+ getResources().getString(R.string.min));

data.add(item);

}

adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.items,

new String[]{"name", "time"}, new int[]{R.id.name, R.id.time});

handler.sendEmptyMessage(0);

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

最后在来说下Handler这个类:

官方描述:A Handler allows you to send and process Message and Runnable objects associated with a thread‘s MessageQueue. Each Handler instance is associated with a single thread and that thread‘s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.

特点:

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)
        以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

通过Handler更新UI实例:(这个是别人写的这里自己留着做个参考)

步骤:

1、创建Handler对象(此处创建于主线程中便于更新UI)。

2、构建Runnable对象,在Runnable中更新界面。

3、在子线程的run方法中向UI线程post,runnable对象来更新UI。

时间: 2024-10-16 20:25:57

安卓问题总结二(更新UI出现的问题)的相关文章

安卓下载文件怎样更新UI进度

曾经写过几篇关于下载的文章.总的来说是下面几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task. 以防止下载反复.并将信息保存至数据库. 2.下载线程Task继承自Runnable,使用RandomAccessFile来保证能够断点下载. 3.下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也能够是BroadCast. 反编译过非常多的apk.并查看下载模块,使用Liste

安卓下载文件如何更新UI进度

以前写过几篇关于下载的文章,总的来说是以下几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task.以防止下载重复,并将信息保存至数据库. 2.下载线程Task继承自Runnable,使用RandomAccessFile来保证可以断点下载. 3.下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也可以是BroadCast. 反编译过很多的apk,并查看下载模块,使用Listene

Android更新Ui进阶精解(二)

<代码里的世界> 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45115047 Android更新Ui进阶精解(一) android ui线程检查机制 Android更新Ui进阶精解(二) android 线程更新UI机制 1.回顾 第一篇讲了对Ui线程更新的方法和见解,然后接着讲了线程检查机制,这里来详细分析下更新Ui的核心--Android中消息系统模型.当然,这里要

Android异步处理二:使用AsyncTask异步更新UI界面

Android异步处理二:使用AsyncTask异步更新UI界面 - lzc的专栏 - 博客频道 - CSDN.NET 在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们使用Thread+Handler的方式实现了异步更新UI界面,这一篇中,我们介绍一种更为简洁的实现方式:使用AsyncTask异步更新UI界面. 概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的

Android异步处理系列文章四篇之二 使用AsyncTask异步更新UI界面

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理二:使用AsyncTask异步更新UI界面 概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现

安卓 异步线程更新Ui

异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构造方法里接收handler参数,然后执行完耗时操作后,通过handler发送消息来通知主UI线程更新UI 2.接口回调,定义一个接口,然后在主UI执行耗时操作的时候,借助匿名内部类,在这里写异步线程返回来的数据处理操作,异步线程接收一个匿名的内部类实例,然后在执行完耗时操作后回调接口的方法,可以把耗

Android异步处理二:AsynTask介绍和使用AsyncTask异步更新UI界面

在上一篇(http://blog.csdn.net/xlgen157387/article/details/45269389)中介绍了使用Thread+Handler实现非UI线程更新UI界面的方法步骤,下边做一下如何同构AsyncTask异步任务来更新UI界面. (1)AsyncTask的介绍 通过上图中的AsyncTask的源码结构图可以看到,主要用于重载的方法是doInBackground(),onPreExecute().onPostExecute().onProgressUpdate(

更新UI常见方法

UI更新方法一:Handler+View.invalidate+Thread+Runnable UI更新方法二:View.postInvalidate+Thread+Runnable UI更新方法三:Handler+Worker Thread UI更新方法四:在Worker Thread中runOnUiThread直接刷新UI UI更新方法五:利用AsyncTask更新UI

关于runOnUiThread()与Handler两种更新UI的方法

在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(vi