第四节(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)_异步网络操作的更多相关文章

  1. android内部培训视频_第三节 常用控件(Button,TextView,EditText,AutocompleteTextView)

    第三节:常用控件 一.Button 需要掌握的属性: 1.可切换的背景 2.9.png使用 3.按钮点击事件 1)  onClick 3) 匿名类 4) 公共类 二.TextView 常用属性 1.a ...

  2. android内部培训视频_第二节 布局基础

    第二节:布局入门 一.线性布局 需要掌握的属性: 1.orientation:排列方式 vertical:垂直 Horizontal:水平 2.weight:水平布局的权重 3.gravity:子控件 ...

  3. android内部培训视频_第一节

    声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...

  4. android内部培训视频_第五节(1)_OA实战之登录界面

    第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...

  5. android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)

    第三节(2):常用控件之ViewPager.日期时间相关.ListView  一.ViewPager 实例:结合PagerAdapter滑动切换图片  二.日期时间相关:AnalogClock\Dig ...

  6. Rafy 领域实体框架 - 公司内部培训视频

    本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...

  7. sencha touch 在线实战培训 第一期 第四节

    2014.1.4晚上8点开的课 第一节收费课程,还是有几位同学付费了,这些课程也录像了的,以后也会持续销售. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容:          ...

  8. 【Android测试】【第十四节】Appium——简述

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5124340.html 前言 同样的,这一篇我要介绍的也是一 ...

  9. Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)

    一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...

随机推荐

  1. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  2. iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法

    问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...

  3. C# 条形码操作【源码下载】

    本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...

  4. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  5. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  6. EntityFramework.Extended 支持 MySql

    EntityFramework.Extended 默认不支持 MySql,需要配置如下代码: [DbConfigurationType(typeof(DbContextConfiguration))] ...

  7. <译>通过PowerShell工具跨多台服务器执行SQL脚本

    有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...

  8. Android Studio分类整理res/Layout中的布局文件(创建子目录)

    res/layout中的布局文件太杂,没有层次感,受不了的我治好想办法解决这个问题. 前几天看博客说可以使用插件分组,可惜我没找到.知道看到另一篇博客时,才知道这个方法不能用了. 不能用插件,那就手动 ...

  9. 真正的汉化-PowerDesigner 16.5 汉化

    一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后,就一直在使用16,不过一直是英文.一些同事对使用英文版总显示有些吃力. 遍寻百度.必应,都没有找到真正的针对版本16的汉 ...

  10. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...