Android异步加载图片的坑

最近学习安卓,今天看下安卓异步加载图片的坑。。。


屏幕快照 2017-03-01 下午5.08.29.png
//按钮的点击事件中,创建新线程,调用 getImage()方法获得图片回调,若不为空利用Handler发送消息更新UI
@Override
    public void onClick(View v) {
        final String url = editText.getText().toString();
        new Thread(new Runnable() {
            @Override
            public void run() {
                bitmap = getImage(url);
                if (bitmap != null) {
                    Message msg = new Message();
                    msg.obj = bitmap;
                    msg.what = 1;
                    handler.sendMessage(msg);
                }
            }

        }).start();
    }

坑1

handler.sendMessage();

此方法一直爆红,查看API,发现有 android.os.Handler java.util.logging.Handler 两个包,导错了包。

坑2

private Bitmap getImage(String url) {
        HttpURLConnection connection = null;
        try {
            URL myurl = new URL(url);
            connection = (HttpURLConnection) myurl.openConnection();
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(5000);
            connection.setRequestMethod("GET");
            connection.connect();
            int responseCode = connection.getResponseCode();
            if (responseCode == 200) {
                InputStream inputStream = connection.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);//根据读数据创建位图对象
               // Toast.makeText(this, "success" + responseCode, Toast.LENGTH_LONG).show();
                return bitmap;
            } else {
                //Toast.makeText(this, "NONONO" + responseCode, Toast.LENGTH_LONG).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
          //  Toast.makeText(this, "NONONO" + e, Toast.LENGTH_LONG).show();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
        return null;
    }

点击获取图片就崩溃,原因,

       Toast.makeText(this, "success" + responseCode, Toast.LENGTH_LONG).show();

Toast 属于UI操作,放在了子线程导致崩溃。

总结下来就是,刷新UI必须在主线程,网络请求必须在子线程。安卓的包是坑。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,556评论 25 708
  • 2017年5月17日 Kylin_Wu 标注(★☆)为考纲明确给出考点(必考) 常见手机系统(★☆) And...
    Azur_wxj阅读 1,844评论 0 10
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,255评论 4 61
  • 看完心理学的书,再看小说,觉得好表面……
    深海绿妖阅读 453评论 0 1
  • 有些人还未说再见道离别就不知不觉地走了 所谓的生命里的命数终究是你我都无法预测的 无法挣脱 也无法逃避 这颗心,究...
    d64c6bbfb059阅读 490评论 0 0