android内部培训视频_第四节(1)_异步网络操作
第四节(1):异步网络操作
一、结合asyncTask下载网络图片
1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMap(下载成功后的图片)
public class downloadImageTask extends AsyncTask<String, Integer, Bitmap> { /** * 在线程开始之前执行 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.setTitle("提示"); dialog.setMessage("正在下载数据,请稍候..."); dialog.show(); } /** * 异步执行耗时操作 */ @Override protected Bitmap doInBackground(String... params) {} /** * 执行完成后 */ @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); image1.setImageBitmap(result); } }
2.实现doInBackground
1) 定义HttpClient和HttpGet
HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(params[0]); //params[0]为主线程调用时传入的url地址
2) 利用HttpResponse取得网络返回
try { HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); byte[] data = EntityUtils.toByteArray(entity); bitmap = BitmapFactory .decodeByteArray(data, 0, data.length); } // 404/500 } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_LONG) .show(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
3.主线程调用
// 启用多线程访问网络下载图片 new downloadImageTask() .execute("http://image.tianjimedia.com/uploadImages/2013/287/IEOV0N9V8RR7_1000x500.jpg");
二、下载网络json数据,并绑定至listview
json内容:
{ users: [ { face: "001.jpg", headShip: "软件工程师", userName: "周瑜" }, { face: "002.jpg", headShip: "开发人员", userName: "陈风" }, { face: "003.jpg", headShip: "开发人员", userName: "季炜" }, { face: "004.jpg", headShip: "开发人员", userName: "小包" }, { face: "005.jpg", headShip: "开发人员", userName: "小裴" } ] }
1.根据json格式定义User实体
package com.cmcc.utils; public class User { private String userName; private String headShip; private String face; public User() { super(); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getHeadShip() { return headShip; } public void setHeadShip(String headShip) { this.headShip = headShip; } public String getFace() { return face; } public void setFace(String face) { this.face = face; } }
2.利用asyncTask下载数据
public class getUserTask extends AsyncTask<String, Void, List<User>>{ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.setTitle("提示"); dialog.setMessage("正在下载,请稍候..."); dialog.show(); } @Override protected List<User> doInBackground(String... params) { // TODO Auto-generated method stub List<User> list = new ArrayList<User>(); HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(params[0]); try { HttpResponse response = client.execute(get); if(response.getStatusLine().getStatusCode() == 200){ String json = EntityUtils.toString(response.getEntity()); JSONObject jsonObj = new JSONObject(json); JSONArray jsonArray = jsonObj.getJSONArray("users"); for(int i = 0;i<jsonArray.length();i++){ JSONObject obj = jsonArray.getJSONObject(i); User user = new User(); user.setUserName(obj.getString("userName")); user.setHeadShip(obj.getString("headShip")); user.setFace(obj.getString("face")); list.add(user); } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } @Override protected void onPostExecute(List<User> result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); myAdapter adapter = new myAdapter(result,MainActivity.this); //自定义adapter,详见下面代码 listview1.setAdapter(adapter); } }
3.自定义baseAdapter,绑定listView
public class myAdapter extends BaseAdapter{ List<User> list; Context context; LayoutInflater inflater; public myAdapter(List<User> list,Context context) { super(); this.list = list; this.context = context; inflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view; if(convertView!=null){ view = convertView; }else{ view = inflater.inflate(R.layout.user, null); } final ImageView face = (ImageView) view.findViewById(R.id.face); TextView tvUserName = (TextView) view.findViewById(R.id.tvUserName); TextView tvHeadShip = (TextView) view.findViewById(R.id.tvHeadShip); tvUserName.setText(list.get(position).getUserName()); tvHeadShip.setText(list.get(position).getHeadShip()); //头像下载,实现类详见后面代码 String imageUrl = "http://xxx.xxxx.xxxx/resources/face/"+list.get(position).getFace(); DownloadFace download = new DownloadFace(imageUrl); download.loadImageFromUrl(new downloadFaceCallBack() { @Override public void setDrawble(Drawable drawable) { // TODO Auto-generated method stub face.setImageDrawable(drawable); } }); return view; } }
三、ListView中异步下载头像
下载头像线程类
package com.cmcc.utils; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import android.R.drawable; import android.annotation.SuppressLint; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; public class DownloadFace { String faceUrl; public DownloadFace(String faceUrl) { super(); this.faceUrl = faceUrl; } @SuppressLint("HandlerLeak") public void loadImageFromUrl(final downloadFaceCallBack callback) { final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Drawable drawable = (Drawable) msg.obj; callback.setDrawble(drawable); } }; new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Drawable drawable = Drawable.createFromStream(new URL( faceUrl).openStream(), ""); Message msg = Message.obtain(); msg.obj = drawable; handler.sendMessage(msg); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } public interface downloadFaceCallBack { public void setDrawble(Drawable drawable); } }
百度网盘视频下载地址:http://pan.baidu.com/s/1ntFNJjb
android内部培训视频_第四节(1)_异步网络操作的更多相关文章
- android内部培训视频_第三节 常用控件(Button,TextView,EditText,AutocompleteTextView)
第三节:常用控件 一.Button 需要掌握的属性: 1.可切换的背景 2.9.png使用 3.按钮点击事件 1) onClick 3) 匿名类 4) 公共类 二.TextView 常用属性 1.a ...
- android内部培训视频_第二节 布局基础
第二节:布局入门 一.线性布局 需要掌握的属性: 1.orientation:排列方式 vertical:垂直 Horizontal:水平 2.weight:水平布局的权重 3.gravity:子控件 ...
- android内部培训视频_第一节
声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...
- android内部培训视频_第五节(1)_OA实战之登录界面
第五节(1):OA实战之登录界面 一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
第三节(2):常用控件之ViewPager.日期时间相关.ListView 一.ViewPager 实例:结合PagerAdapter滑动切换图片 二.日期时间相关:AnalogClock\Dig ...
- Rafy 领域实体框架 - 公司内部培训视频
本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...
- sencha touch 在线实战培训 第一期 第四节
2014.1.4晚上8点开的课 第一节收费课程,还是有几位同学付费了,这些课程也录像了的,以后也会持续销售. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容: ...
- 【Android测试】【第十四节】Appium——简述
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5124340.html 前言 同样的,这一篇我要介绍的也是一 ...
- Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)
一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...
随机推荐
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- Socket聊天程序——初始设计
写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...
- 展望未来:使用 PostCSS 和 cssnext 书写 CSS
原文链接:A look into writing future CSS with PostCSS and cssnext 译者:nzbin 像twitter,google,bbc使用的一样,我打算看一 ...
- Angular企业级开发(3)-Angular MVC实现
1.MVC介绍 Model-View-Controller 在20世纪80年代为程序语言Smalltalk发明的一种软件架构.MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并 ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- javascript动画系列第一篇——模拟拖拽
× 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 游戏AI系列内容 咋样才能做个有意思的AI呢
游戏AI系列内容 咋样才能做个有意思的AI呢 写在前面的话 怪物AI怎么才能做的比较有意思.其实这个命题有点大,我作为一个仅仅进入游戏行业两年接触怪物AI还不到一年的程序员来说,来谈这个话题,我想我是 ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...