1.我们在Android下,实现使用http协议进行网络通信,请求网络数据。这里是获取网络上的图片信息,让它可以显示在手机上;

但是我们这个手机连接网络是很费时间,如果我们在主线程(UI线程)中写这个网络连接的逻辑,这是很容易报一个错误:android.os.NetworkOnMainThreadException(Android4.0之后引入的异常)

主线程很重要,它负责监听系统的各种事件,如果主线程在一段时间内没有响应,系统就会这个应用程序无响应,就会产生ANR的异常。下面有必要说明一下这个ANR异常:

2.ANRs ("Application Not Responding"),意思是"应用没有响应".

在如下情况下,Android会报出ANR错误:
•主线程 ("事件处理线程"/ "UI线程") 在5秒内没有响应输入事件.
• BroadcastReceiver 没有在10秒内完成返回.

通常情况下,下面这些做法会导致ANR:
(1).在主线程内进行网络操作
(2).在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)

应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢”…等等

逻辑应该是:
(1). new出一个新的线程,进行数据请求.
(2). 获取数据后,调用handler.sendMessage方法.

(3). 在handler的handle()方法中更新UI.

案例:

activity_main.xml:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context=".MainActivity" >
 6
 7     <Button
 8         android:onClick="click"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:layout_centerHorizontal="true"
12         android:layout_centerVertical="true"
13         android:text="点我" />
14
15 </RelativeLayout>

MainActivity.java:

package com.itheima.anr;import android.app.Activity;
import android.os.Bundle;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View view){try {System.out.println(Thread.currentThread().getName());Thread.sleep(6000);//当前线程。
            } catch (InterruptedException e) {e.printStackTrace();}}}

这里的Thread.sleep(6000),这里的表示Thread线程是Main线程,也就是UI主线程,我们之前说过了UI主线程在5s不能响应,系统就会认为这个应用程序是不响应的。这里6s>5s,所以会报错ANRs ("Application Not Responding")

3.前面说了这么多,也就是说了关于在Android下进行网络连接注意事项,网络连接是耗时程序代码:下面开始实现网络图片浏览器程序:

MainActivity.java:

package com.itheima.netimageviewer;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity {private EditText et_path;private ImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_path = (EditText) findViewById(R.id.et_path);iv = (ImageView) findViewById(R.id.iv);}/*** 点击查看网络上的图片* * @param view*/public void click(View view) {String path = et_path.getText().toString().trim();// http://www.baidu.com/aa.pngif (TextUtils.isEmpty(path)) {Toast.makeText(this, "图片路径不能为空", 0).show();return;}//把文件名编码之后+缓冲的路径变成file文件File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(), Base64.DEFAULT));if (file.exists() && file.length() > 0) {System.out.println("图片存在,拿缓存");Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());iv.setImageBitmap(bitmap);} else {System.out.println("图片不存在,获取数据生成缓存");// 通过http请求把图片获取下来。try {// 1.声明访问的路径, url 网络资源 http ftp rtspURL url = new URL(path);// 2.通过路径得到一个连接 http的连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 3.判断服务器给我们返回的状态信息。// 200 成功 302 重定向 404资源没找到 5xx 服务器内部错误int code = conn.getResponseCode();if (code == 200) {//这个流是用来接收图片的InputStream is = conn.getInputStream();// png的图片//这个输出流是吧图片写入安卓系统的储存区的FileOutputStream fos = new FileOutputStream(file);//读写操作byte[] buffer = new byte[1024];int len = -1;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}is.close();fos.close();//通过图片工厂来获取文件路径, 然后变成图片传递给控件Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());iv.setImageBitmap(bitmap);} else {// 请求失败Toast.makeText(this, "请求失败", 0).show();}} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "发生异常,请求失败", 0).show();}}}
}

activity_main.xml:

<LinearLayout 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"android:orientation="vertical"tools:context=".MainActivity" ><EditTextandroid:text="http://www.baidu.com/img/bd_logo1.png"android:id="@+id/et_path"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入网络图片的路径" /><Buttonandroid:onClick="click"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查看" /><ImageViewandroid:id="@+id/iv"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.himi.webpicturewatch"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-sdkandroid:minSdkVersion="15"android:targetSdkVersion="17" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

转载于:https://www.cnblogs.com/hebao0514/p/4767538.html

Android(java)学习笔记144:网络图片浏览器的实现(ANR)相关推荐

  1. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  2. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  3. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  4. java/android 设计模式学习笔记(1)---单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  5. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  6. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  7. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

  8. JAVA学习笔记(1)【基础知识】

    JAVA学习笔记DAY_1 提示:关于java系列的内容只是本人在老师的指导下和自学过程中的一些学习笔记,如果存在错误敬请批评指正! 文章目录 JAVA学习笔记DAY_1 前言 一.Java语言未来的 ...

  9. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  10. Java学习笔记5-1——多线程

    目录 前言 核心概念 线程创建 继承Thread类 实现Runnable接口 上述两个方法小结 实现Callable接口 并发问题简介 静态代理模式 线程状态 线程停止(stop) 线程休眠(slee ...

最新文章

  1. 谷歌一员工确诊新冠肺炎:已大面积限制员工出行
  2. ubuntu14.04 安装 bcm43142无线网卡
  3. Office2013插件开发Outlook篇(1)-- 第一个office2013插件
  4. Hadoop + Amazon EC2 –更新的教程
  5. 数据结构排序系列详解之一 插入排序
  6. jboss:在standalone.xml中设置系统属性(system-properties)
  7. 关于《大道至简》第八章的收获
  8. TheFatRat自动化渗透工具
  9. excel服务器正在配置文件,excel2007取消正在配置进度的方法
  10. Inspect(VB.NET、C#版)软件的的下载和使用
  11. 当yum安装包时显示系统空间不足,求指教
  12. 迷宫 动画 java_Java实现可视化迷宫
  13. 小迪安全|第08天:信息收集-架构,搭建,WAF等
  14. 苹果笔记本开机问号白色问号?
  15. javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>
  16. download file with c++
  17. 数据格式:大端模式(Big-endian)和小端模式(Little-endian)
  18. 【C语言】全面解析指针,指针知识点整理
  19. VR能巅覆传统音乐产业吗?
  20. 有哪些强大好用的音频格式转换软件?

热门文章

  1. 【CodeForces - 1A】Theatre Square(水题,几何)(CODEFORCES,梦的开始)
  2. 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)
  3. java 反射 代码_java反射机制学习代码
  4. html 表格文字颜色 css,CSS 表格-JavaScript中文网-JavaScript教程资源分享门户
  5. deepin部署python开发环境_deepin系统下部署Python3.5的开发及运行环境
  6. 帧同步_帧同步和状态同步该怎么选(上)
  7. 普通IO流字符输入输出流文件拷贝
  8. Maven项目发布的配置
  9. Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器
  10. 字符串上的简单动态规划