文档章节

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

w
 wuwulh
发布于 2010/08/23 00:48
字数 666
阅读 32713
收藏 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 面试(四):Android Service 你真的能应答自如了吗?

本次我们没有采取分享公众号推文的方法,我想直接这样看看效果。 本文首发于微信公众号「nanchen」,你可以直接在公众号搜索「nanchen」或者扫描最下面的二维码关注我。做不完的开源,写不完...

nanchen2251
2017/11/06
0
0
Android中AsyncTask的简单用法

在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(U...

带梦想一7飞
2012/07/09
0
0
说说在 Android 中如何实现多线程编程

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

deniro
06/18
0
0
Android 多线AsyncTask详解

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

AbrahamLeeJay
2014/07/11
0
0
Android中AsyncTask的处理后台耗时操作(如list排序,进度加载)

在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(U...

chengche
2013/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

摘要: 有一个业务是查询最新审核的5条数据 ```sql SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `status` = 'ONLINE' ORDER BY `audit_time` D. 原来链接 ......

阿里云官方博客
29分钟前
2
0
详解如何用爬虫采集视频播放量数据(以腾讯视频为例)

现代社会提到大数据大家都知道这是近几年才形成的对于数据相关的新名词,在1980年,著名未来学家阿尔文·托夫勒便在 《第三次浪潮》一书中,将大数据热情地赞颂为“第三次浪潮的 华彩乐章”...

技术阿飞
35分钟前
5
0
区块链时代的拜占庭容错:Tendermint(二)

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》 原文作者:Ethan Buchman 翻译:饶云坤 校对:傅晓波 本文为节选 以下为正文: 本章阐述Tendermint共识算法...

万向区块链
48分钟前
2
0
AS连接网易Mumu模拟器

1、安装模拟器 打开这个网址现在模拟器然后安装 http://mumu.163.com/ 2、安装完成后启动模拟器 3、进入模拟器安装目录 例如本机的安装目录:C:\Program Files (x86)\MuMu\emulator\nemu\vmo...

HGMrWang
54分钟前
9
0
设计要做到扩展性强还挺难的

概述 在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是: 你不熟悉这个行业的业务的玩法 我举个例子来...

Sam哥哥聊技术
56分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部