学习andriod开发之 异步加载图片--- 使用系统进度条

大家好 我是akira 学习图片异步加载的例子

说道这里有人可能要问了 什么是异步 为什么要用异步 why?

说白了很简单 省时间 省资源 我举个例子你就懂了 比如你在下东西 至于下什么

那些邪恶的骚年们又要YY了 不去管他们。比如你在下东西 这个时候 另外一个人也在下同一个东西

那么那个人怎么办 他就等你下完 等到天荒地老?ありえないこと impossible

他肯定也要下 那么问题就来了 他如何下?这个时候就要用到异步

说道这里 有人可能问什么叫同步 什么叫异步 我在这里在给大家举一个简单的例子

假如你在吃饭 这个时候你觉得淡了 如果我停下来去放完盐吃 那么就是同步 如果我接着吃 旁边有个服务员给我放盐

这个就是异步 OK 介绍了这么多 你应该知道同步和异步的概念了吧。

一个简单的异步做法 前面说了 这次是使用加载图片的例子 那么又说道加载图片了

问题又来了 andriod中有哪两种方式 当然答案很简单其一就是handler 其二就是我们今天要讲的AsyncTask

接着跟着文档来 看看文档怎么介绍的它

这里的东西很长 首先你应该看到这哥们是一个抽象类 那么就要用到机能 其次看到 4steps onPre doIn onPro onPost

这就够了

接下来 看看这里的方法吧

onPreExecute()

Runs on the UI thread before doInBackground(Params...).

doInBackground(Params...
params)

Override this method to perform a computation on a background thread.

onProgressUpdate(Progress...
values)

Runs on the UI thread after publishProgress(Progress...) is
invoked.

onPostExecute(Result
result)

Runs on the UI thread after doInBackground(Params...).

这个顺序 就是执行的顺序 而pre的回调中自然是放你的进度 或者初始化一些东西 改变进度在Update中就好

耗时当然是后台完成的 doInBack 最后完成 看到runs on uI thread after了么 这个后就是最后的回调

一般来说 这四个是必须的 甚至来说除去update三个是必须的

而三个参数

String 是你传进来的链接 url Interger 注意 这里不能直接传int 就算你知道更新的只是数字也一样

而最后的那个就是你返回的结果 你可以返回一个String 也可以返回一个boolean 甚至是一个 BitMap 都可以

就是这么简单 来看看代码

咱先别着急写布局 直接代码开始

我就直接上代码了

/**
 * Created by akira on 2015/1/27.
 */
public class ImageDownloadTask extends AsyncTask<String,Integer,String> {
    private Bitmap downloadImg;
    private ProgressBar mBar;
    private Context mContext;
    private int mPro = 0;
    private int MAX_PRO = 100;
    private ImageView netImageView;

    public ImageDownloadTask(Context context, ImageView imageView, ProgressBar bar){
        this.mContext = context;
        this.netImageView = imageView;
        this.mBar = bar;
    }

    @Override
    protected void onPreExecute() {
//        super.onPreExecute();
        mBar.setMax(MAX_PRO);
        mBar.setProgress(mPro);
        mBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(String... params) {
        URL imageUrl = null;
        InputStream inputStream = null;
        try {
            imageUrl = new URL(params[0]);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();
            connection.setDoInput(true);
            connection.connect();
            inputStream =  connection.getInputStream();
            downloadImg =  BitmapFactory.decodeStream(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return "ok";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
//        super.onProgressUpdate(values);
        mPro = values[0];
       mBar.setProgress(mPro);
    }

    @Override
    protected void onPostExecute(String s) {
//        super.onPostExecute(s);
         mBar.setProgress(MAX_PRO);
         mBar.setVisibility(View.GONE);
         netImageView.setVisibility(View.VISIBLE);
         netImageView.setImageBitmap(downloadImg);
    }
}

这里我没做什么注释 因为有些东西一看就明白

首先 你要知道进度有最大进度和最小进度 咱先不管进度是怎么来的 因为你一传就有了

那么就产生了三个变量 mBar mPro MAX_PRO其次 因为要显示 拿什么显示 这里我就简单用一个imageVIew了

更好的可以用自定义的view 去在canvas上画 这样的做法更灵活 这个以后再讲 然后会产生一个bitmap位图

要知道所有的andriod系统都是位图 因此downloadImg 就产生了

剩下的就是按部就班 传传传 然后 onPre显示 bar doinback 这里的代码也很熟悉了

我就拿一个Url连接去做了 比较省事 其实拿imageLoader更简单

然后 返回是否ok了 onPost就是设置你的bitmap然后bar gone掉 imageview visible你会发现先分析完过程

之后写代码就是这么简单

接下来的东西更没什么难度

看看吧

public class MainActivity extends Activity {
    String url ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(TextUtils.isEmpty(url))
            url = "http://bbra.cn/Uploadfiles/imgs/20110303/fengjin/015.jpg";
        final ProgressBar bar = (ProgressBar) findViewById(R.id.bar);
        final ImageView img = (ImageView) findViewById(R.id.img);

        findViewById(R.id.downBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new ImageDownloadTask(MainActivity.this,img,bar).execute(url);
            }
        });
    }

}

只有一个onClick 然后执行Url

布局代码更简单

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"  tools:context=".MainActivity">

    <TextView
        android:id="@+id/hello"
        android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:layout_below="@id/hello"
        android:id="@+id/downBtn"
        android:text="down"
        android:textSize="20sp"
        android:textColor="@android:color/black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ImageView
        android:layout_centerInParent="true"
        android:layout_below="@id/downBtn"
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitXY"
        android:visibility="gone"
        />

    <ProgressBar
        android:id="@+id/bar"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        />

</RelativeLayout>

最后看下效果

有人说不对啊 这里怎么还有加载完毕呢

那是我在onPost回调里面提示了一下而已

有人说不对啊 这里我怎么一点就退呢

那是因为这个是联网操作 检查下是否加上了权限

<uses-permission android:name="android.permission.INTERNET" />

有人又说 不对啊 加入我网非常卡的话 一直再转 谁知道你什么时候加载完

而且这东西太丑了 我想改怎么办

这个就要看下一篇了

OK 下一篇 咱们就来写一个自定义的进度条

时间: 2024-08-29 02:22:25

学习andriod开发之 异步加载图片--- 使用系统进度条的相关文章

学习andriod开发之 异步加载图片(二)--- 使用其他进度条

大家好 我是akira上一节 我们讲到使用AsyncTask 这个类进行异步的下载 主要是涉及到一些图片的更新 这次我们继续上一个demo的改进 . 不知道你是否发现一个问题 上一节我们遗留了两个bug 1 在无网络情况下 点击会崩 咱们说 软件开发最忌讳的就是crash 而这个是在bug解决方案中的一级要解决的 所以这个问题 必须搞定 2 就是我们会发现进度并未更新 而图片是显示完毕了的 3 就是一个扩展 这次我将会带来 daimajia的新库 也是做库小达人的最新作品 NumberProgr

异步加载场景及Loading进度条制作

实现功能:点击开始游戏以后UI界面进入Loading界面,Loading结束以后自动进入游戏场景. 在这之前先在Build Settings中Add要使用的场景 在场景A中添加StartGame方法: Application.LoadLevel(1)://同步加载Loading界面(因为Loading界面资源较少速度快所以此处用同步方法) 在Loading场景中加入进度条图片:分为上下两层,上层负责显示进度 将上层的进度条Image组件中的Image Ttpe改为Filled 接下来再Loadi

异步加载场景和Loading进度条制作

在切换场景的时候,直接 用 application.LoadLevel()这个方法,如果加载的场景资源过多的话,会卡死一段时间的. 所以,用一个过渡的场景的话,体验会好一点. 那么就先开始做一个过渡的场景(名字叫做:Loading)吧..(比如像下面酱紫,百度的一张图片) 要切换场景的时候,Application.LoadLevel("Loading"):就先切换到这个Loading场景,Loading场景资源少,就一个背景图和一个slider,所以,直接同步加载过来也很快的 然后,在

WinForm中异步加载数据并使用进度条

在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可以提供一个进度条使用户明白程序正在加载数据,同时清楚知道目前加载的进度. 实现上述功能的一个简单的方式是利用 System.ComponentModel 中的工具类:BackgroundWorker,它支持取消,进度报告,异常转发,并且实现了 IComponent 接口,意味着可以直接在VS设计器中

android开发干货:实现listview异步加载图片

针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师说凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<String, SoftReference<Drawable>> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠.另外,Android 3.0

[原创]cocos2dx加载网络图片&amp;异步加载图片

[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些 [相关知识] png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示, 这种i

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不

Android 实现异步加载图片

麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的. 今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便.在doInBackground()方法里实现下载逻辑.具体实现如下 实现逻辑是:先从内存中读取,如果内存中有这张图片,则直接使用;如果内存没有再到sdcard上读取,如果有则显示;如