正常访问状态! 设为首页 | 加入收藏夹 | 浏览历史  
  http://www.guosp.com
 碧海澜涛居
  海纳百川,有容乃大。壁立千刃,无欲则刚!
 
 
关键词:
  网站首页 | 关于本站 | 技术资料 | 美文日志 | 读书收藏 | 影视收藏 | 软件收藏 | 摄影相册| 留言板 
  技术资料 >> Android技术 关闭(快捷键alt+C)
搜索标签: 加载 实例 异步加载
Android网络图片异步加载实例
[阅读次数:626次]  [发布时间:2013年11月23日]

实现思路是:

1:在UI线程中启动一个线程,让这个线程去下载图片。

2:图片完成下载后发送一个消息去通知UI线程

2UI线程获取到消息后,更新UI

这里的UI线程就是主线程。

这两个步骤涉及到一些知识点,即是:ProgressDialog,Handler,Thread/Runnable,URL,HttpURLConnection等等一系列东东的使用。

现在让我们开始来实现这个功能吧!

第一步:新建项目。

第二步:设计好UI,如下所示:

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03 android:orientation="vertical"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 >
07 <Button
08 android:id="@+id/btnFirst"
09 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="异步下载方式一"
12 >
13 </Button>
14
15 <Button
16 android:id="@+id/btnSecond"
17 android:layout_width="fill_parent"
18 android:layout_height="wrap_content"
19 android:text="异步下载方式二"
20 >
21 </Button>
22
23 <FrameLayout
24 android:layout_width="fill_parent"
25 android:layout_height="match_parent"
26 android:id="@+id/frameLayout"
27 >
28
29 <ImageView
30 android:id="@+id/image"
31 android:layout_width="match_parent"
32 android:layout_height="match_parent"
33 android:scaleType="centerInside"
34 android:padding="2dp"
35 >
36 </ImageView>
37
38 <ProgressBar
39 android:id="@+id/progress"
40 android:layout_width="wrap_content"
41 android:layout_height="wrap_content"
42 android:layout_gravity="center">
43 </ProgressBar>
44
45 </FrameLayout>
46 </LinearLayout>

第三步:获取UI相应View组件,并添加事件监听。

01 public class DownLoaderActivity extends Activity implementsOnClickListener{
02 private static final String params="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Hukou_Waterfall.jpg/800px-Hukou_Waterfall.jpg";
03
04 private Button btnFirst,btnSecond;
05 private ProgressBar progress;
06 private FrameLayout frameLayout;
07 private Bitmap bitmap=null;
08 ProgressDialog dialog=null;
09
10
11 @Override
12 public void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.main);
15
16 btnFirst=(Button)this.findViewById(R.id.btnFirst);
17 btnSecond=(Button)this.findViewById(R.id.btnSecond);
18 progress=(ProgressBar)this.findViewById(R.id.progress);
19 progress.setVisibility(View.GONE);
20 frameLayout=(FrameLayout)this.findViewById(R.id.frameLayout);
21
22 btnFirst.setOnClickListener(this);
23 btnSecond.setOnClickListener(this);
24 }</SPAN>

第四步:在监听事件中处理我们的逻辑,即是下载服务器端图片数据。

这里我们需要讲解一下了。

通常的我们把一些耗时的工作用另外一个线程来操作,比如,下载上传图片,读取大批量XML数据,读取大批量sqlite数据信息。为什么呢?答案大家都明白,用户体验问题。

在这里,首先我构造一个进度条对话框,用来显示下载进度,然后开辟一个线程去下载图片数据,下载数据完毕后,通知主UI线程去更新显示我们的图片。

Handler是沟通Activity Thread/runnable的桥梁。而Handler是运行在主UI线程中的,它与子线程可以通过Message对象来传递数据。具体代码如下:

01 **这里重写handleMessage方法,接受到子线程数据后更新UI**/
02 private Handler handler=new Handler(){
03 @Override
04 public void handleMessage(Message msg){
05 switch(msg.what){
06 case 1:
07 //关闭
08 ImageView view=(ImageView)frameLayout.findViewById(R.id.image);
09 view.setImageBitmap(bitmap);
10 dialog.dismiss();
11 break;
12 }
13 }
14 };

我们在这里弹出进度对话框,使用HTTP协议来获取数据。

01 //前台ui线程在显示ProgressDialog,
02 //后台线程在下载数据,数据下载完毕,关闭进度框
03 @Override
04 public void onClick(View view) {
05 switch(view.getId()){
06 case R.id.btnFirst:
07 dialog= ProgressDialog.show(this,"",
08 "下载数据,请稍等 …",true,true);
09 //启动一个后台线程
10 handler.post(new Runnable(){
11 @Override
12 public void run() {
13 //这里下载数据
14 try{
15 URL url= new URL(params);
16 HttpURLConnection conn= (HttpURLConnection)url.openConnection();
17 conn.setDoInput(true);
18 conn.connect();
19 InputStream inputStream=conn.getInputStream();
20 bitmap= BitmapFactory.decodeStream(inputStream);
21 Message msg=new Message();
22 msg.what=1;
23 handler.sendMessage(msg);
24
25 }catch (MalformedURLException e1) {
26 e1.printStackTrace();
27 }catch (IOException e) {
28 // TODO Auto-generated catch block
29 e.printStackTrace();
30 }
31 }
32 });
33 break;
34 }
35 }

如此以来,你会发现很好的完成了我们的下载目标了,你可以把它应用到其他方面去,举一反三。

运行截图如下
image003.jpgimage005.jpgimage007.jpg





本页地址: [复制地址]
该页内容非本站原创 收藏自:http://www.open-open.com/bbs/view/1318591627530
返回顶部 关闭(快捷键alt+C)
评论统计(0条)| 我要评论
暂无评论内容!
我要评论 
我要评论: 带*部分需要填写
 姓名称呼: * 请填写您的姓名或呢称
联系方式: QQ,MSN,Email都可以,方便交流 (仅管理员可见)
 评论内容: * 不超过100字符,50汉字
验证码:
    
  推荐链接
  最近更新  
·Host 'XXX' is not allowed...
·Win2008或IIS7的文件上传大...
·IIS7.0上传文件限制的解决方...
·测试信息2015-03-11
·asp.net中处理图片
·ASP.NET之Web打印-终极解决...
·Asp.net下C#调用Word模版实...
·asp.net下将页面内容导入到...
·asp.net导出为pdf文件
·asp.net生成pdf文件
·FCKeditor 文本编辑器的使用...
·ASP.NET 将数据生成PDF
·asp.net2.0导出pdf文件完美...
·AspJpeg的安装与测试
·JS验证浏览器版本对IE11的支...
  热门浏览  
·IE8和IE9出现“此网页上的问...
·无线路由器密码破解,教你断...
·js替换所有回车换行符
·QQ/MSN在线交流代码
·IE弹出“中国工商银行防钓鱼...
·如何取消键盘上的一些快捷键...
·win7声音小的解决方法
·webdav漏洞的利用
·强制两端对齐的函数或者CSS...
·win7下成功安装sql server ...
·显示器分辨率调的过高导致电...
·天诺时空技术技术论坛
·js验证手机号码格式
·JS展开和收缩效果(二)
·本地计算机上的 MSSQLSERVE...
  碧海澜涛居
网站首页关于本站站长简介开发案例技术资料美文日志摄影相册读书收藏影视收藏留言板
版权所有:碧海澜涛 QQ:410436434 Email:shaopo_guo@163.com 苏ICP备15000526号
免责声明:本站为个人网站,站内所有文字、图片等各类资料均为个人兴趣爱好所收集,不用作任何商业用途,亦不保证资料的真实性,若有因浏览本站内容而导致的各类纠纷,本站也不承担任何责任。本站部分内容来自互联网,如有涉及到您的权益或隐私请联系站长解决。