Android(java)學習筆記144:網絡圖片瀏覽器的實現(ANR)

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458963.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DLL導出函數名稱改編的解決方法

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 1.DLL編譯后導出函數名稱改變 在編寫一個DLL后&#xff0c;為了能被別的程序調用&…

組合自定義控件的步驟詳解

Android 步驟&#xff1a; 1 自定義組合控件的布局settint_view.xml<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"and…

linux如何建立隱藏目錄,【Linux】文件與目錄的默認權限與隱藏權限

01. 文件默認權限&#xff1a;umask文件的權限可以使用chmod來改變&#xff0c;但是我們默認創建文件的權限是什么&#xff1f;那就是與umask這個有關了。下來我們學習這個指令1.1 簡單使用umask[rootiZbp13q6hd8z3xaagcmz6gZ /]# umask0022[rootiZbp13q6hd8z3xaagcmz6gZ /]# u…

Servlet和JSP學習指導與實踐(二):Session追蹤

前言&#xff1a; web應用中經常需要對某些有用的信息進行存儲或者附加一些信息。本文主要介紹session&#xff0c;即“會話”跟蹤的幾種不同方式~ ----------------------------4種管理session的方式&#xff1a; 1.重寫url 通過在請求的url后面追加參數信息進行會話跟蹤。如&…

數據存儲和界面展示(二)

#測試 黑盒測試 測試邏輯業務 白盒測試 測試邏輯方法 根據測試粒度 方法測試&#xff1a;function test 單元測試&#xff1a;unit test 集成測試&#xff1a;integration test 系統測試&#xff1a;system test 根據測試暴力程度 冒煙測試&#xff1a;smoke test 壓力測…

linux在A目錄下創建B文件,Linux課程---5、常用文件命令和目錄命令(創建文件命令)...

Linux課程---5、常用文件命令和目錄命令(創建文件命令)一、總結一句話總結&#xff1a;touch file11、管道符|有什么用&#xff1f;將前一個命令的結果作為后一個命令的輸入&#xff1a;比如查看文件前3行&#xff1a;cat file1 | head -32、linux下如何復制粘貼命令是什么&…

window 系統上傳文件到linux 系統出現dos 格式換行符

Windows里的文件在Unix/Mac下打開的話&#xff0c;在每行的結尾可能會多出一個^M符號&#xff0c;Unix/Mac系統下的文件在Windows里打開的話&#xff0c;所有文字會變成一行&#xff0c;所以為了避免這種情況的發生&#xff0c;我們可以在linux系統內轉換格式 Centos系列可以直…

#pragma once與 #ifndef的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 為了避免同一個文件被include多次 1 #ifndef方式2 #pragma once方式 在能夠支持這…

android學習者優秀網址推薦

非常漂亮的android UI庫集合&#xff0c;別人整理的&#xff0c;如果感覺不錯&#xff0c;趕快收藏吧&#xff01;&#xff01; https://github.com/wasabeef/awesome-android-ui https://github.com/Trinea/android-open-project android中文社區網 http://www.android-studio…

linux while read文件,linux shell腳本用while read逐行讀取文本的問題

問題:我現在是想用一個腳本獲取一定列表服務器的運行時間。首先我建立一個名字為ip.txt的IP列表(一個IP一行)&#xff0c;再建好密鑰實現不用密碼直接登錄。然后寫腳本如下&#xff1a;#!/bin/bashwhile read ips;doecho $ips;done < ip.txt腳本實現了逐行讀取列表中的IP&am…

常用字符串處理函數匯總

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** (一)strcmp函數 strcmp函數是比較兩個字符串的大小,返回比較的結果。一般形式是&…

兼容性記錄-class屬性

getAttribute獲得class屬性時,IE6,IE7的傳參是className,IE7和現代游覽器都是class全部游覽器DOMElement均有的className屬性,其在IE各版本號下的均表現良好返回屬性class值的字符串此外html5中DOMElement有個classList屬性,它返回一個類型為DOMTokenList的對象,它當中有非常多…

magenta內核與linux,谷歌將推出新操作系統Fuchsia:Magenta語言為內核

谷歌現在研發出來并且推出使用的系統有Chrome OS、Android和Chromecasts&#xff0c;這三者在操作系統的市場中占得份額很高&#xff0c;但是好像谷歌對此并不滿意&#xff0c;因為有相關消息顯示&#xff0c;谷歌正在研發新的操作系統Fuchsia&#xff0c;該系統采用Magenta語言…

BZOJ 1968: [Ahoi2005]COMMON 約數研究 水題

1968: [Ahoi2005]COMMON 約數研究 Time Limit: 20 Sec Memory Limit: 256 MB 題目連接 http://www.lydsy.com/JudgeOnline/problem.php?id1968 Description Input 只有一行一個整數 N&#xff08;0 < N < 1000000&#xff09;。 Output 只有一行輸出&#xff0c;為整數M…

VC內存對齊準則(Memory alignment)

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 本文所有內容在建立在一個前提下&#xff1a;使用VC編譯器。著重點在于&#xff1a;VC…

[redis設計與實現][7]基本數據結構——對象

Redis對基礎數據類型進行了封裝&#xff0c;構建出上層的對象系統&#xff0c;這個系統包含&#xff1a;字符串對象、列表對象、哈希對象、集合對象和有序集合對象。 Redis對象結構&#xff1a; [cce lang”c”] typedef struct redisObject { //類型 unsigned type:4; //編碼 …

Linux中samba的權限詳解,活用三種權限 理解Samba的權限控制

在企業內網開發環境方面&#xff0c;文件服務器是一個非常重要的環節。在這當中&#xff0c;Samba服務器由于其權限控制的高度靈活性&#xff0c;在這里撫琴煮酒會進行一些列詳細的說明。之前我們已經介紹了Samba服務器一些入門和基本的更換用戶、端口監聽、列表控制等技巧&…

安卓基礎01

安卓基礎01SDK System images 這是在創建模擬器時需要的system image&#xff0c;也就是在創建模擬器時CPU/ABI項需要選擇的&#xff0c;下載并解壓后&#xff0c;將解壓出的整個文件夾復制或者移動到 your sdk 路徑/system-images文件夾下即可&#xff0c; 如果沒有 system-im…

C++存儲區域基礎概念詳解

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 以下詳解來自&#xff1a; http://blog.163.com/zb_075/blog/static/3734032820115110…

創建、修改、刪除表總結

一、創建表 CREATE TABLE <表名> &#xff08;<列名><數據類型>[列級完整性約束條件] [&#xff0c;<列名> <數據類型>[列級完整性約束條件]] … [&#xff0c;表級完整性約束條件]&#xff09;&#xff1b; 如果完整性約束條件涉及到該表的多個…