Android网络编程--获取网络图片

*(面试题)什么是ANR?怎么避免ANR才出现
* 答:1、android在高版本加入了自检逻辑,检测应用程序里面的网络交互逻辑是否是
* 在主线程里面执行的,如果是,则抛出以上异常。低版本是没有这个检测逻辑的。
*    2、为什么在主线程休眠一会,就会抛出ANR呢?
*    因为android赋予程序主线程极大的权利,他是一个非常重要的工作,就是去更新UI,
*    或者刷新界面的显示。它必须时刻等待,警惕用户接下来要与界面的交互工作。如果
*    主线程执行一个事情耗费非常多的时间,就会抛出ANR。
* (面试题)什么是消息处理机制,
*  答:handle就是消息处理器,主要是非主线程中的数据或信息更新到主线程中去,然后显示在UI界面上。
*handler的步骤:
* 1、定义消息处理器:
*   
 Handler handler = new Handler(){
           @Override
           public void handleMessage(Message msg) {
           super.handleMessage(msg);
           }
         }
       };
2、在线程中发送消息,如果有多个发送地方,应该以what标记
Message msg = Message.obtain();
msg.what = 2;
msg.obj = "图片访问失败,请检查网络";
handler.sendMessage(msg);
3、在handler里面处理消息
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Bitmap bitmap = (Bitmap)msg.obj;
mImage.setImageBitmap(bitmap);
break;
case 2:
String info = (String)msg.obj;
Toast.makeText(MainActivity.this,info,Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};

网络获取图片:

<pre name="code" class="java">package lzl.edu.com.clientdemo;

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.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends Activity {

    private Button mSelect;
    private EditText mPath;
    private ImageView mImage;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                    Bitmap bitmap = (Bitmap)msg.obj;
                    mImage.setImageBitmap(bitmap);
                    break;
                case 2:
                    String info = (String)msg.obj;
                    Toast.makeText(MainActivity.this,info,Toast.LENGTH_LONG).show();
                    break;
                default:
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSelect = (Button)findViewById(R.id.select);
        mPath = (EditText)findViewById(R.id.path);
        mImage=(ImageView)findViewById(R.id.image);

        mSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String path = mPath.getText().toString().trim();
                Log.i("图片的资源路径:",path);
                Log.i("ruesult:",TextUtils.isEmpty(path)+"");
                if(!TextUtils.isEmpty(path)){
                   new Thread(){
                       @Override
                       public void run() {
                           super.run();
                           Bitmap bitmap = getImageFromServer(path);
                           Message msg = new Message();
                           msg.what = 1;
                           msg.obj = bitmap;
                           handler.sendMessage(msg);
                       }
                   }.start();
                }
            }
        });
    }

    /**
     * 获得网络上的图片
     * 直接在主线程中请求网络会出现netWorkOnMainThreadException错误。
     * @param path
     * @return
     */
    private Bitmap getImageFromServer(String path){
        try {
            //1、获得统一资源定位符
            URL url = new URL(path);
            //2、装化成http网络请求
            HttpURLConnection connection =(HttpURLConnection)url.openConnection();
            connection.setRequestMethod("GET"); //默认是get请求,当写POST时便是post请求
            connection.setConnectTimeout(5000); //设置访问超时的时间。
            if(200==connection.getResponseCode()){  //获取响应码
                //获取资源类型
                String type = connection.getContentType();
                //获取资源的长度
                int length = connection.getContentLength();
                Log.i("图片的资源:","type==="+type+"length==="+length);
                //3、获取网络输入流
                InputStream is = connection.getInputStream();
                //4、将流转换成bitmap对象
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                return bitmap;
            }
        }catch (Exception e){
            Message msg = Message.obtain();
            msg.what = 2;
            msg.obj = "图片访问失败,请检查网络";
            handler.sendMessage(msg);
        }
        return null;
    }
}

 布局是一个button和EditView、ImageView很简单这里不再列出。 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值