AsyncTask实例代码演示Android异步任务
原文地址
http://bbs.isgphone.com/viewthread.php?tid=5455
请支持原创
上次我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。
首先Android123以简单的下载例子演示该类的大致结构,如下
- private class DownloadFilesTask extends AsyncTask {
- protected Long doInBackground(URL... urls) {
- int count = urls.length;
- long totalSize = 0;
- for (int i = 0; i < count; i++) {
- totalSize += Downloader.downloadFile(urls[i]);
- publishProgress((int) ((i / (float) count)100));
- }
- return totalSize;
- }
- protected void onProgressUpdate(Integer... progress) {
- setProgressPercent(progress[0]);
- }
- protected void onPostExecute(Long result) {
- showDialog("Downloaded " + result + " bytes");
- }
- }
最终我们执行 DownloadFilesTask().execute(url1, url2, url3); 即可。
在Android浏览器中下载Favicon图标的实现如下:
- class DownloadTouchIcon extends AsyncTask {
- private final ContentResolver mContentResolver;
- private final Cursor mCursor;
- private final String mOriginalUrl;
- private final String mUrl;
- private final String mUserAgent;
- /* package */ BrowserActivity mActivity;
- public DownloadTouchIcon(BrowserActivity activity, ContentResolver cr,
- Cursor c, WebView view) { //构造方法
- mActivity = activity;
- mContentResolver = cr;
- mCursor = c;
- mOriginalUrl = view.getOriginalUrl();
- mUrl = view.getUrl();
- mUserAgent = view.getSettings().getUserAgentString();
- }
- public DownloadTouchIcon(ContentResolver cr, Cursor c, String url) { //实现本类的构造
- mActivity = null;
- mContentResolver = cr;
- mCursor = c;
- mOriginalUrl = null;
- mUrl = url;
- mUserAgent = null;
- }
- @Override
- public Bitmap doInBackground(String... values) { //返回Bitmap类型
- String url = values[0];
- AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
- HttpGet request = new HttpGet(url);
- HttpClientParams.setRedirecting(client.getParams(), true); //处理302等重定向问题
- try {
- HttpResponse response = client.execute(request);
- if (response.getStatusLine().getStatusCode() == 200) { //如果OK
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- InputStream content = entity.getContent(); //将图标保存到InputStream中,因为是二进制内容
- if (content != null) {
- Bitmap icon = BitmapFactory.decodeStream( //从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream
- content, null, null);
- return icon;
- }
- }
- }
- } catch (IllegalArgumentException ex) {
- request.abort();
- } catch (IOException ex) {
- request.abort();
- } finally {
- client.close();
- }
- return null;
- }
- @Override
- protected void onCancelled() {
- if (mCursor != null) {
- mCursor.close();
- }
- }
- @Override
- public void onPostExecute(Bitmap icon) {
- if (mActivity != null) {
- mActivity.mTouchIconLoader = null;
- }
- if (icon == null || mCursor == null || isCancelled()) {
- return;
- }
最终图标要保存到浏览器的内部数据库中,系统程序均保存为SQLite格式,Browser也不例外,因为图片是二进制的所以使用字节数组存储数据库的BLOB类型
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
- icon.compress(Bitmap.CompressFormat.PNG, 100, os); //将Bitmap压缩成PNG编码,质量为100%存储
- ContentValues values = new ContentValues(); //构造SQLite的Content对象,这里也可以使用raw sql代替
- values.put(Browser.BookmarkColumns.TOUCH_ICON,os.toByteArray()); //写入数据库的Browser.BookmarkColumns.TOUCH_ICON字段
- if (mCursor.moveToFirst()) {
- do {
- mContentResolver.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, mCursor.getInt(0)),values, null, null);
- } while (mCursor.moveToNext());
- }
- mCursor.close();
- }
- }
本次Android开发网通过两个AsyncTask类演示了多种类型的任务构造,这里大家注意返回类型,本节演示了Android平台上Content Provider、AsyncTask、Bitmap、HTTP以及Stream的相关操作,大家如何想很快提高开发水平其实只要理解Google如何去实现Android系统常规构架就可以轻松入门谷歌移动平台。
本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/578720

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
仅有USB线拷贝无SD卡小米照相文件方法
由于只有有线路由,又还没有买SD卡,所以一直没法把小米和电脑的文件交换。搜过很多次一直没找到答案。 今天无意中看到图片属性中有“路径”,晚上就用adb shell跑进去看了看,发现文件果然都存在那里。 于是又想到了用adb可以双向传送。既然路打通了,那么其他apk文件也自然可以用这种方式交换。 方法很简单。如果你有收益的话,请转帖时注明出处(猪少爷的奋斗http://blog.csdn.net/leonpard/article/details/7294656/)。多谢! 前提:已经安装了ADB,如果没有,安装Android SDK即可 1、在DOS窗口敲adb,设置路径保障adb能够调用成功,然后执行adb root 2、小米手机侧->“图库”->“临时相机”, 3、长按要copy出来的照片,弹出菜单选择“图片属性”,记住“标题”中的文件名 3、adb pull /data/sdcard/DCIM/Camera/IMG_20120225_211945.jpg IMG_20120225_211945.jpg 好了。图片就到硬盘上了。 本文转自leonpard 51CTO博...
-
下一篇
小米真机调试Android程序
1、从官方网站下载usb驱动程序,解压到E:\software\xiaomi_usb_driver 2、插好USB线,打开小米的“USB调试”开关,XP会自动检测到USB设备,选择从E:\software\xiaomi_usb_driver搜索驱动,一切顺利 3、安装好后XP的“设备管理器”中会新增一个“Android Phone”和"Xiaomi mass storage USB device" 4、可以用360手机助手测试一下是否操作正常 好了,环境齐备 1、打开eclipse,下载安装2.3.3的 SDK plateform 2、File->New ->Project->Android project,一路默认 3、确认没有编译错误 4、Run->Run as->Android application 5、在弹出选择框中选中连接设备,小米的设备号仅仅是一串数字,没有字母 移动开发,你终于来了! 本文转自leonpard 51CTO博客,原文链接:http://blog.51cto.com/leonpard/1172645
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境