博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 关于操作UI线程
阅读量:6222 次
发布时间:2019-06-21

本文共 1844 字,大约阅读时间需要 6 分钟。

在非UI线程里访问 Android UI toolkit—这个在一个worker线程修改了  。这会导致不可预期的结果,而且还难以调试。

 

为了修复这个问题,Android提供了几个方法从非UI线程访问Android UI toolkit 。详见下面的这个列表:

 

可以使用  方法来修改之前的代码:

 

public void onClick(View v){    new Thread(new Runnable(){        public void run(){            final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");            mImageView.post(new Runnable(){                public void run(){                    mImageView.setImageBitmap(bitmap);                }            });        }    }).start();}

  

现在这个方案的线程安全的:这个网络操作在独立线程中完成后,UI线程便会对 进行操作。

 

使用 AsyncTask

 能让你在UI上进行异步操作。它在一个worker线程里进行一些阻塞操作然后把结果交给UI主线程,在这个过程中不需要你对线程或者handler进行处理。

使用它,你必须继承  并实现  回调方法,这个方法运行在一个后台线程池里面。如果你需要更新UI,那么你应该实现这个方法从  取出结果,然后在 UI 线程里面运行,所以你可以安全的更新你的UI。你可以通过在UI线程调用 方法来运行这个任务。

比如,你可以通过使用 来实现之前的例子:

public void onClick(View v){    new DownloadImageTask().execute("http://example.com/image.png");}private class DownloadImageTask extends AsyncTask
{    /** The system calls this to perform work in a worker thread and      * delivers it the parameters given to AsyncTask.execute() */    protected Bitmap doInBackground(String... urls){        return loadImageFromNetwork(urls[0]);    }        /** The system calls this to perform work in the UI thread and delivers      * the result from doInBackground() */    protected void onPostExecute(Bitmap result){        mImageView.setImageBitmap(result);    }}

  

现在UI是安全的了,代码也更加简单了,因为AsyncTask把worker线程里做的事和UI线程里要做的事分开了。

你应该阅读一下  的参考文档以便更好的使用它。下面就是一个对  如何作用的快速的总览:

  • 你可以具体设置参数的类型,进度值,任务的终值,使用的范型
  •   方法自动在 worker 线程执行
  • , 和  方法都是在UI线程被调用
  •   的返回值会被送往 方法
  • 你可以随时在 方法里面调用  方法来执行UI 线程里面的 方法
  • 你可以从任何线程取消这个任务

注意: 你在使用worker线程的时候可能会碰到的另一个问题就是因为 (比如用户改变了屏幕的方向)导致你的activity不可预期的重启,这可能会kill掉你的worker线程。为了解决这个问题你可以参考  这个项目。

线程安全的方法

在某些情况下,你实现的方法可能会被多个线程所调用,因此你必须把它写出线程安全的。

 

转自:http://greenrobot.me/devpost/android-thread-and-process/

 

转载地址:http://bagja.baihongyu.com/

你可能感兴趣的文章
将String保存成文件
查看>>
12款JavaScript表单插件
查看>>
HDOJ 1090
查看>>
ajax交互的两种方式:html与xml
查看>>
Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
查看>>
Android通讯录查询篇--ContactsContract.Data
查看>>
去掉TabActivity底部默认白线
查看>>
ISS配置的错误
查看>>
jq倾斜的动画导航菜单
查看>>
[AaronYang原创] 大话ASP.NET MVC3+ (C#与DOM与JS页面上的很炫的技巧)
查看>>
有感20131009
查看>>
Python: 拷贝函数签名
查看>>
C# DataTable 转 List(大家进来讨论讨论)
查看>>
Database Management System 基础01:管理自己的任何事
查看>>
Android 显示网络图片
查看>>
SQL 存储过程入门(事务)(四)
查看>>
秒杀多线程第四篇 一个经典的多线程同步问题
查看>>
[SQL Server优化]善用系统监视器,确定系统瓶颈
查看>>
Wireshark数据抓包教程之Wireshark捕获数据
查看>>
jquery发送异步请求
查看>>