文档章节

Android多线程,让耗时的操作去后台运行吧

w
 wuwulh
发布于 2010/08/23 00:48
字数 666
阅读 32851
收藏 63

android程序中,会有一些耗时的操作,比如从网上抓取图片,下载文件,批量更新数据库等,这些操作对于手机而言会需要很长的时间,而应用程序界面又不能等到这些操作完成后再显示,所以要让界面各这些耗时的操作并行处理,用多线程可以解决这个问题。当然还有其它解决方案,比如用Service.

我们先作一个例子吧,大概是这样的:有一个列表,每行显示的一个图片,图片是存放在网上的。如果不用多线程,也是可以的,但是要等到所有图片下载完了才能展示出来。这种方式对用户体验很不友好,所以我们采用多线程的方式,对每一个图片开启一个线程,当其下载完数据后,在主线程中显示出来。

Activity

public class TestListActivity extends ListActivity {
private ImageListAdapter imageListAdapter = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.imagelist);
String[] images = {"http://image.baidu.com/image1.jpg","http://image.baidu.com/image2.jpg"};
imageListAdapter = new ImageListAdapter(getApplicationContext(), images);
setListAdapter(imageListAdapter);
}
}

适配器

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ImageListAdapter extends BaseAdapter {
private Context context;
private String[] myImages = null;
public ImageListAdapter(Context context, String[] myImages){
this.context = context;
this.myImages = myImages;
}
@Override
public int getCount() {
if(myImages == null){
return 0;
}
return myImages.length;
}

@Override
public String getItem(int position) {
if(position < 0 || myImages == null || position>myImages.length){
return null;
}
return myImages[position];
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

View item = null;
if(convertView != null){
item = convertView;
} else {
item = View.inflate(context, R.layout.image_item, null);
}

final ImageView imageView = (ImageView)item.findViewById(R.id.image);

final String image = getItem(position);
if(image == null){
return item;
}
//对每个图片地址创建一个线程,
new Thread(){
public void run(){
Message msg = new Message();
msg.what = 0;
//获得图片的Bitmap对象。getBitmap省略了,就是从网上通过http下载图片然后转化成一个Bitmap
Bitmap bitmap = getBitmap(image);
List list = new ArrayList();//将bitmap和imageView包装成一个List传到线程外
list.add(bitmap);
list.add(imageView);
msg.obj = list;
handler.sendMessage(msg);
}
}.start();

return item;
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0://接到从线程内传来的图片bitmap和imageView.
//这里只是将bitmap传到imageView中就行了。只所以不在线程中做是考虑到线程的安全性。
List list = (List)msg.obj;
Bitmap bitmap = (Bitmap)list.get(0);
ImageView iv = (ImageView)list.get(1);
iv.setImageBitmap(bitmap);

break;
default:
super.handleMessage(msg);
}
}
};
}

布局xml
imagelist.xml


android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding = "10px"
android:gravity="center_horizontal"
android:background="#ffffff">


android:layout_width="fill_parent"
android:layout_height="fill_parent" />

android:layout_width="wrap_content"
android:layout_height="wrap_content" />

image_item.xml



android:layout_width="fill_parent"
android:layout_height="wrap_content">


android:id="@+id/image"
android:layout_width="70px"
android:layout_height="50px"
android:paddingRight="5px"/>


转载请标明出处:3G Study :http://blog.3gstdy.com/archives/27

© 著作权归作者所有

w

wuwulh

粉丝 12
博文 53
码字总数 6288
作品 1
东城
私信 提问
加载中

评论(16)

1元4700套安卓源码 新店开张
http://weidian.com/i/1411913192?wfr=c
进去联系卖家(我) 你想怎样就怎样!!!!!!!!
1元4700套源码 新店求支持
http://weidian.com/i/1411913192?wfr=c
inwer
inwer
XIEXIEFENGXIANG
geekren
geekren
建议用Async async=new Async();
六六七七
不错 感谢上帝创造了楼主

引用来自“后起之秀”的评论

学习了~

我也学习中, 给个探讨的好地方,看我昵称你就知道了
W
WilliamLau
感谢楼主的分享
dreamZHX
dreamZHX
学习了
soliucheng
soliucheng
发送 Msg 后,需要在主Activity 中接收此msg.并展示出来。
星月
星月
学习了 谢谢啦 原来对线程不熟
说说在 Android 中如何实现多线程编程

当我们执行一些耗时操作,比如发起一条网络请求时,考虑到网速等其他因素,服务器未必会立刻响应我们的请求,那么就必须将这类操作放在子线程中运行,这就需要实现多线程编程。 1 启动线程 ...

deniro
2018/06/18
0
0
Android AsyncTask与handler

本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的,并且和用...

长平狐
2013/01/06
244
0
Android 多线AsyncTask详解

Android 多线AsyncTask详解 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 ...

AbrahamLeeJay
2014/07/11
85
0
Android之多线程工作-AsyncTask与handler

本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的,并且和用...

鉴客
2012/03/09
1K
0
Android之多线程工作-AsyncTask与handler

本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的,并且和用...

晨曦之光
2012/03/01
3.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Nervos CKB 脚本编程简介[1]:验证模型

CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者:Jason,Orange 译文链接:https://talk.nervos.org/t/c...

NervosCommunity
25分钟前
4
0
消息中间件——RabbitMQ的高级特性

前言 前面我们介绍了RabbitMQ的安装、各大消息中间件的对比、AMQP核心概念、管控台的使用、快速入门RabbitMQ。本章将介绍RabbitMQ的高级特性。分两篇(上/下)进行介绍。 消息如何保障100%的...

Java架构师ya七
57分钟前
9
0
如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
今天
7
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部