遇到的问题

      之前在学习android开发视频的时候,学习到从网络上下载图片并显示,但发现会报 NetworkOnMainThreadException,后来几经查证发现,在android 中实现网络访问等操作时由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会出现假死的现象,产生很不好的用户体验。所以,默认的情况下如果直接在主线程中访问就报出了这个异常,名字是NetworkOnMainThreadException

解决该问题的办法

1. 独立线程

2. 异步线程AsyncTask

3. StrictMode修改默认的策略


这里采用第一种方法来实现功能:


首先要注意在功能清单文件中加上访问网络的权限:



接下来编写工具类,主要用于从网络中读取数据

工具类1:

package StreamTool;import java.io.ByteArrayOutputStream;import java.io.InputStream;/** * Created by Administrator on 2015/11/30. */public class Streamtool {    public static byte[] readDate(InputStream inputStream)throws Exception    {        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();        int len=0;        byte[] buffer=new byte[1024];        while((len=inputStream.read(buffer))!=-1)        {            outputStream.write(buffer,0,len);        }       inputStream.close();        return  outputStream.toByteArray();    }}


工具类2,这里为了方便测试,直接将访问的图片路径写死了,也可以自己输入

package StreamTool;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;/** * Created by Administrator on 2015/11/30. */public class GetImage {    public static final String PATH="http://docs.ebdoor.com/Image/ProductImage/0/3006/30060407_1.jpg";    public static final int ONE_SECOND=1000;    public static byte[] getNetimage()throws Exception    {        URL url=new URL(PATH);        HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();        httpURLConnection.setRequestMethod("GET");        httpURLConnection.setReadTimeout(5 * ONE_SECOND);        InputStream inputStream=httpURLConnection.getInputStream();        return Streamtool.readDate(inputStream);    }}

   

主代码:

package com.example.administrator.getimageapplication;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import StreamTool.GetImage;public class GetImageActivity extends Activity {    private static final String TAG="GetImageActivity";    private Button button;    private ImageView imageView;    private Thread mthread;    private static final int MSG_SUCCESS=1;    private static final int MSG_FAILE=0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_get_image);        button=(Button)findViewById(R.id.show);        imageView=(ImageView)findViewById(R.id.showimage);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(mthread==null)                {                    mthread=new Thread(runnable);                    mthread.start();                }                else                {                    Toast.makeText(GetImageActivity.this,R.string.start_sucess,Toast.LENGTH_LONG).show();                }            }        });    }    private Handler handler=new Handler()    {        @Override        public void handleMessage(Message msg) {            switch (msg.what)            {                case MSG_SUCCESS:                    imageView.setImageBitmap((Bitmap) msg.obj);                    Toast.makeText(GetImageActivity.this,R.string.show_sucess,Toast.LENGTH_LONG).show();                    break;                case MSG_FAILE:                    Toast.makeText(GetImageActivity.this,R.string.show_faile,Toast.LENGTH_LONG).show();                    break;            }        }    };    Runnable runnable=new Runnable() {        @Override        public void run() {            Bitmap bitmap=null;            try            {                byte[] date=GetImage.getNetimage();                bitmap= BitmapFactory.decodeByteArray(date,0,date.length);            }            catch (Exception e)            {                e.printStackTrace();                Log.e(TAG, e.toString());                handler.obtainMessage(MSG_FAILE).sendToTarget();                return;            }            handler.obtainMessage(MSG_SUCCESS,bitmap).sendToTarget();        }    };}

实现结果:






注:本人新手学习,有什么不足的地方恳请大家给出自己的意见,共同学习共同进步









更多相关文章

  1. Android(安卓)ZXing 二维码、条形码扫描介绍
  2. 为Android、iOS设备搭建模拟丢包、慢速网络模拟环境
  3. 为什么Android应用用Java开发,为什么Android大型游戏要用数据包?这
  4. Android工程中R类访问不到工程中的资源文件的解决方法
  5. android的 网络下载和数据持久化
  6. Android卸载监听之后访问后台或者弹出一个网页
  7. Android(安卓)访问FTP 服务器,实现文件的下载
  8. Android调用WCFRest
  9. Android中使用Volley开源库进行Http网络请求(GET方式)

随机推荐

  1. 阿里云栖大会 app加固小记
  2. Android(安卓)-- Init进程对属性系统的处
  3. Android二维码的扫描和生成(ZXing)
  4. Android技术学习的实现机制和一些常用技
  5. android 解决音标乱码的,高手自在人间 (转
  6. Android(安卓)四种线程池
  7. (4.1.36.3)android Graphics(一):概述及基本几
  8. 通过创建一个位图的XY Chart来学习Androi
  9. Android传感器 设备坐标系到世界坐标系的
  10. ios模仿android屏幕密度控件自动适配