学习andriod开发之 异步加载图片(二)

大家好 我是akira上一节 我们讲到使用AsyncTask 这个类进行异步的下载

主要是涉及到一些图片的更新 这次我们继续上一个demo的改进 。

不知道你是否发现一个问题 上一节我们遗留了两个bug 1 在无网络情况下 点击会崩

咱们说 软件开发最忌讳的就是crash 而这个是在bug解决方案中的一级要解决的 所以这个问题

必须搞定 2 就是我们会发现进度并未更新 而图片是显示完毕了的 3 就是一个扩展 这次我将会带来

daimajia的新库 也是做库小达人的最新作品NumberProgressBar的使用。

1 首先 咱们问题一个一个的解决 首先是第一个 点击会崩溃 那我们就要清楚 why

也就是为什么点击会崩溃 解决这个问题的源头要从原来的代码看起

下面这段代码

try {HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();connection.setDoInput(true);connection.connect();inputStream = connection.getInputStream();downloadImg = BitmapFactory.decodeStream(inputStream);}其实 我们一眼就能看出来 其实就是你如果没网就拿不到流 因为我是没做过图片缓存的 也就是说 每次点击都会去get

没有流 就会造成 inputstream为null 而 再去加载一个null 自然而然 就XXX了 所以 我们找到根源 就是要判断得到的流是否为null

但 仅仅如此么 显然不是 我们最好从源头找到为什么没网 或者说是一个有网的监听 这样最好

说到网 有人自然会想到wifi 说道wifi有人自然会想当然是去想到一个类叫做wifiManager 好 我就满足你的需求

来解析下wifiManager会不会提供一个有没有网的方法 来去判断

先看下wifiManager的实例化

WifiManager manager = (WifiManager) getSystemService(WIFI_SERVICE);wifiState = manager.getWifiState();//wifi状态第一段代码适用于很多的manager 比如inputmanager actvitymanager 等等

而第二句就是很多人想要的那个状态 究竟是不是想要的呢 我们继续往下看

这里面的状态 我也写下来了

private final int WIFI_STATE_DISABLING = 0 ;//表示停用中。private final int WIFI_STATE_DISABLED = 1; //表示不可用。private final int WIFI_STATE_ENABLING = 2; //表示启动中。private final int WIFI_STATE_ENABLED = 3; //表示准备就绪。private final int WIFI_STATE_UNKNOWN = 4; //表示未知状态。看到这个你会想到什么 我第一眼想到的是我自己的网件路由器 这尼玛就是一个网络的加载过程 而且还是wifi的

我们发现最靠谱的启动中似乎也不能满足我们的需求 这个时候有些人也许开始怀疑人生 忘了说

如果你想监听wifi的状态 你还需要加上权限

如下

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />但是 根本的问题还是没解决呀

所以 别怀疑了 咱从头来过吧

这个时候 有人提到了ConnectivityManager 咦? 这个行不行呢

咱来看看

ConnectivityManager cManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);NetworkInfo mInfo = cManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);yahoo!!! 不错 看起来挺靠谱 继续往下深究mInfo.isAvailable()这个api就是告诉你网络是否可用 前面那个type有很多 这里面就说了wifi的 都比较简单 咱就不去官网看了

然后 你想怎么做 是判断当前网络可用就点击么 nono 万一url为空怎么办 考虑到严谨性和代码的健壮性 咱们

要进行并且的判断

并且去设置按钮是否为可点

Button downBtn = (Button) findViewById(R.id.downBtn);if (mInfo.isAvailable() && !TextUtils.isEmpty(url)){downBtn.setClickable(true);downBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new ImageDownloadTask(MainActivity.this,img,bar).execute(url);}});}else{downBtn.setClickable(false);downBtn.setOnClickListener(null);Toast.makeText(MainActivity.this,"当前无wifi",Toast.LENGTH_SHORT).show();}

OK 外面的逻辑 咱们处理完了 解决了1 crash

PS: 其实这里解决网络很不专业 一般在正式项目里 我们都会写一个广播接受 去观察网络是否可用 这个放到以后

广播的时候再讲

2 关于更新进度 首先 我很清楚一点 如果我要更新一个进度 我肯定要知道一个

总进度 一个当前进度 还有一个通知其刷的这么一个方法

OK 来看关键代码

int totalLength;//总共长度URL imageUrl = null;//图片的urlint length = -1;InputStream inputStream = null;try {imageUrl = new URL(params[0]);HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();connection.setDoInput(true);connection.connect();inputStream = connection.getInputStream();totalLength = connection.getContentLength();if(inputStream!=null){ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int count = 0;while ((length = inputStream.read(buffer)) != -1) {baos.write(buffer, 0, length);count += length;//这句通知upXXX更新进度publishProgress((int) ((count / (float) totalLength) * 100));}byte[] data=baos.toByteArray();//声明字节数组downloadImg=BitmapFactory.decodeByteArray(data, 0, data. length);return "ok";}}这里面 咱用一个流去写 然后加载的时候从流利去拿 而总长度有一个getContentLength的方法走自己的路,让别人说去吧

学习andriod开发之 异步加载图片(二)

相关文章:

你感兴趣的文章:

标签云: