博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络图片查看器
阅读量:5166 次
发布时间:2019-06-13

本文共 8908 字,大约阅读时间需要 29 分钟。

如何使用安卓程序实现图片的异步图片加载,网络上传,网络查看。本届需要涉及到官员桌处理机制的问题,请参考

1:下面是该程序的效果图:

在文本框中输入图片的路径,点击浏览按钮的同时,将会在上方的ImageView中显示出来该图片。

想要实现上面的程序,需要在按钮的点击事件中,在MainActivity的初始代码:

1 public void viewImage(View view) 2     { 3         String path=etImageUrl.getText().toString();//把图片路径转换成字符串 4         if(TextUtils.isEmpty(path)) 5         { 6             /* 7              * question:对于一个UI界面中,当判断用户是否输入用户名或密码时,我们常用TextUtils.isEmpty()方法来判断;但有时也可以用这个equals()方法,都可以来判断EditText中是否为空,但有时很纠结,不知道这两种方法中哪个比较好?为什么?*/ 8                answer:仔细读官方的API:  Returns true if the string is null or 0-length.   9                因为你从EditText返回的是一个变量。如果这个变量本身为null值,那么你掉它的equals方法是要报错的。但是如果你调用TextUtils.isEmpty() 把这个变量作为参数传进去。10              只要这个参数为空或者为"",都会返回真。所以,用官方给的更加严谨。而且,也十分方便。因为你单独去判断你还不是要写一个if语句判断。返回的还是一个boolean值*/11             12             Toast.makeText(this, R.string.NOnull, Toast.LENGTH_LONG).show();//如果输入路径为空,就弹出Toast13         }else{14             //不为空,连接服务器,请求获得图片15             try{16             URL url=new URL(path);17             //发出http请求18             HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();19             httpURLConnection.setRequestMethod("GET");//设置提交方式20             //设置连接超时时间21             httpURLConnection.setConnectTimeout(5000);//这时,我们设置为超时时间为5秒,如果5秒内不能连接就被认为是有错误发生.22             int responsecode=httpURLConnection.getResponseCode();23             if(responsecode==200){24                 InputStream inputstream=httpURLConnection.getInputStream();25                 Bitmap bitmap=BitmapFactory.decodeStream(inputstream);26                 ivImage.setImageBitmap(bitmap);27             }else{28                 Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();29             }30         }catch(MalformedURLException e){31             e.printStackTrace();32         }catch(IOException E){33             E.printStackTrace();34         }35         36     }

但是当在4.0以下的模拟器上运行会出现一些错误,

对于这个错误的出现:

一:什么是ANR

ANR:Application Not Responding,即应用无响应

二:ANR的类型

ANR一般有三种类型:

1:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

2BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

三:KeyDispatchTimeout

Akey or touch event was not dispatched within the specified time(按键或触摸事件在特定时间内无响应)

具体的超时时间的定义在framework下的

ActivityManagerService.java

//How long we wait until we timeout on key dispatching.

staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000

四:为什么会超时呢?

超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:

(1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)

(2)当前的事件正在处理,但没有及时完成

五:如何避免KeyDispatchTimeout

1UI线程尽量只做跟UI相关的工作

2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理

3:尽量用Handler来处理UIthread和别的thread之间的交互

六:UI线程

说了那么多的UI线程,那么哪些属于UI线程呢?

UI线程主要包括如下:

    1. Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc

    2. AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc

    3. Mainthread handler: handleMessage(), post*(runnable r), etc

所以,应该对该算法进行改进,这就引入了线程的概念,关于线程,在ASP.NET或者java中应该都有详细解释。下面不再进行详细赘余。

什么是进程?

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。
而一个进程又是由多个线程所组成的。
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug。

改进后的程序:(采用的是匿名内部类的方法)

 

1     public void viewImage(View view){ 2         final String imageUrl=etImageUrl.getText().toString(); 3         if(TextUtils.isEmpty(imageUrl)){ 4             Toast.makeText(this, "图片路径不能为空", Toast.LENGTH_LONG).show(); 5         }else{ 6             new Thread(){ 7                  8                     public void run() { 9                         try {   //在处理的过程中,必须进行异常处理10                             URL url=new URL(imageUrl);11                             HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();12                             httpURLConnection.setRequestMethod("GET");13                             httpURLConnection.setConnectTimeout(5000);14                             int responseCode=httpURLConnection.getResponseCode();15                             if(responseCode==200){16                                 InputStream inputStream=httpURLConnection.getInputStream();17                                 Bitmap bitmap=BitmapFactory.decodeStream(inputStream);18                                 Message message=new Message();19                                 message.what=SHOWIMAGE;20                                 message.obj=bitmap;21                                 //ivImage.setImageBitmap(bitmap);22                                 handler.sendMessage(message);23                             }else{24                                 Toast.makeText(MainActivity.this, "显示图片失败", Toast.LENGTH_LONG).show();25                             }26                         } catch (MalformedURLException e) {27                             e.printStackTrace();28                         } catch (IOException e) {29                             e.printStackTrace();30                         }31                     32                 }33             }.start();34             35         }36     }

 

页面布局activity_mian.xml:

1 
11 12
18 19
26 27
35 36

关于异步加载图片,大概相同。

此处需要定义一个异步任务类,AsyncpicTask并让其继承AsyncTask。其主要的代码如下:

1 package com.jikexueyuan.hellonotes; 2  3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.HttpURLConnection; 6 import java.net.MalformedURLException; 7 import java.net.URL; 8  9 import javax.crypto.spec.IvParameterSpec;10 import javax.net.ssl.HttpsURLConnection;11 12 import org.apache.http.entity.InputStreamEntity;13 14 import android.graphics.Bitmap;15 import android.graphics.BitmapFactory;16 import android.os.AsyncTask;17 import android.util.EventLogTags.Description;18 import android.widget.ImageView;19 20 public class AsyncPicTask extends AsyncTask
21 {22 //定义Imageview属性23 private ImageView mIvPicImageView;24 25 //定义后台执行方法26 @Override27 protected Bitmap doInBackground(Object... params)28 {29 Bitmap bitmap=null;30 mIvPicImageView=(ImageView)params[0];31 try32 {33 URL url=new URL((String)params[1]);34 //调用URL对象openConnection()方法创建URLConnection对象35 try36 {37 HttpURLConnection conn=(HttpURLConnection) url.openConnection();38 //设置该urlConnection的doInput请求头字段的值39 conn.setDoInput(true);40 //建立实际的连接41 conn.connect();42 //得到连接的字节流43 InputStream inputStream=conn.getInputStream();44 //解析图片45 bitmap=BitmapFactory.decodeStream(inputStream);46 //关闭字节流对象47 inputStream.close();48 } catch (IOException e)49 {50 e.printStackTrace();51 }52 53 } catch (MalformedURLException e)54 {55 e.printStackTrace();56 }57 58 return bitmap;59 }60 61 protected void onPostExecute(Bitmap result){62 if(result!=null){63 mIvPicImageView.setImageBitmap(result);64 }65 }66 67 }

并修改MainActivity的代码:

1 //异步上传图片 2 public class MainActivity extends Activity{ 3         //private static final String URL="http://img5.duitang.com/uploads/item/201407/07/20140707212215_RHL8S.jpeg"; 4     private static final String URL="http://pica.nipic.com/2008-07-01/200871134114809_2.jpg"; 5     private Button mBtnPicTaskButton; 6         private ImageView mIvPicImageView; 7         @Override 8         protected void onCreate(Bundle savedInstanceState) 9         {10         // TODO Auto-generated method stub11         super.onCreate(savedInstanceState);12         setContentView(R.layout.activity_main);13         //得到布局中的控件14         findView();15         //绑定控件事件16         setListener();17         }18         private void setListener()19         {20             //匿名内部类21              mBtnPicTaskButton.setOnClickListener(new OnClickListener()22             {23                 24                 @Override25                 public void onClick(View arg0)26                 {27                     //定义异步任务,开启异步任务28                     AsyncPicTask picTask=new AsyncPicTask();29                     picTask.execute(mIvPicImageView,URL);30                 }31             });32         }33         private void findView()34         {35          //    绑定控件36             mBtnPicTaskButton=(Button)findViewById(R.id.mBtnPicTaskButton);37             mIvPicImageView=(ImageView)findViewById(R.id.mIvPicImageView);38             39             40         }

对于布局等方面,这里没有进行阐述。实现的功能就是,在页面布局中添加按钮,ImageView控件,当点击异步下载图片的时候,便可以打开该图片,进行下载。

 

 

转载于:https://www.cnblogs.com/xuyinghui/p/4589748.html

你可能感兴趣的文章
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
求出斐波那契数组
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>