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对象.所以一口气的将原本功能上的 ...
随机推荐
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)
系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 太多选择——企业如何选择合适的BI工具?
在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...
- Web安全开发之验证码设计不当引发的撞库问题
感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复.以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题,甚至在一些银行或者电商的登录与查存页面同样存在这个问题,一旦造成撞库无论对 ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- EntityFramework 6 + Mysql 生成POCOs
问题 使用EDMX文件 EF Power Tools参数不正确的解决方法 对于"异常来自 HRESULT:0x80070057 (E_INVALIDARG)",有方法说" ...
- Linux系统中用DNW向ARM开发板下载程序
在Linux下通过dnw来给开发板发送程序.包括驱动程序代码:secbulk.c,应用程序代码:dnw.c.只能运行在32位系统上,在64位系统上提示错误:DNW download Data size ...
- 记从安装centos系统在到使用mono3.2部署MVC过程遇到的问题
一.安装虚拟机并安装配置系统 我不太愿意去下载vmware就用系统里面自带的Hyper-V 系统我选择了最新版本的CentOs6.4 下载地址:http://mirrors.163.com/cento ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...