在Android中,只有主线程(UI线程)才能修改界面,包括Toast显示,改变Imageview中的图片等操作必须通过消息机制通知主线程修改界面

如不采用handler消息机制极有可能出现如下错误

CalledFromWrongThreadException

发生原因:谁创的view对象 谁才能修改它

即只有主线程(UI线程)才能修改界面,包括Toast显示,改变Imageview中的图片等操作必须通过消息机制通知主线程修改界面

为什么只有主线程才能修改界面:如果多个线程同时修改界面,追造成界面混乱

内部实现:

Toast在子线程显示汇报如下错误

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

以上俩种错误均可以采用消息机制避免

案例:网络图片浏览器

1页面布局

<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" ><ImageViewandroid:layout_weight="20"android:id="@+id/iv"android:layout_width="fill_parent"android:layout_height="fill_parent" /><EditTextandroid:id="@+id/et_path"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="http://pic.baike.soso.com/p/20090717/20090717194041-49323064.jpg"android:hint="请输入图片路径"/><Buttonandroid:onClick="click"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="浏览" /></LinearLayout>

EditText中的路径大家最好自己找一个,不保证这个图片地址一直有效

2编写主界面 具体编写点击事件

package com.example.a49_internetpicwatcher;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.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity {protected static final int CHANGE_UI = 1;protected static final int ERROR = 0;private EditText et_path;private ImageView iv;private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {if (msg.what == CHANGE_UI) {Bitmap bitmap = (Bitmap) msg.obj;iv.setImageBitmap(bitmap);} else if (msg.what == ERROR) {Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();}};};@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);}public void click(View view) {final String path = et_path.getText().toString().trim();if (TextUtils.isEmpty(path)) {Log.e("chj", "路径不能为空");// Toast.makeText(MainActivity.this, "路径不能为空",// Toast.LENGTH_SHORT).show();} else {new Thread() {public void run() {// 连接服务器 get获取图片try {URL url = new URL(path);// 根据Url发送http请求HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求方式conn.setRequestMethod("GET");conn.setConnectTimeout(5000);// conn.setReadTimeout(timeoutMillis); //与上面的方法不同// 设置浏览器参数 如浏览器类型 防盗链等conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51");// 得到服务器返回码int code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(is);// iv.setImageBitmap(bitmap);Message msg = new Message();msg.what = CHANGE_UI;msg.obj = bitmap;handler.sendMessage(msg);} else {Log.e("chj", "显示图片失败");Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);// Toast.makeText(MainActivity.this, "显示图片失败",// Toast.LENGTH_SHORT).show();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Log.e("chj", "获取图片失败");// Toast.makeText(MainActivity.this, "获取图片失败",// Toast.LENGTH_SHORT).show();}};}.start();}}}

实际开发中下载图片需要经过如下几个步骤:
一、第一次开始下载图片:下载图片是耗时操作,必须放到子线程中(应该在Service中启动一个子线程去下载图片)
二、根据实际情况,处理下载下来的图片。例如,用户希望图片的大小时10dp、10dp,应该通过代码去裁剪图片
三、下载后的图片需要放到内存的缓存中
第四步:如果再次查看列表中的图片,首先到缓存中查找图片是否存在,若存在,从缓存中取出图片,若不存在,
再次下载(Cache)
第五步:项目开发中,数据库中的数据,图片是单独下载的,其他数据可以通过JSON获取;而且项目开发中,
一般不要自己写代码去下载图片,使用第三方框架去下载

Android笔记 消息机制handler+http之 网络图片浏览器demo相关推荐

  1. Android消息机制Handler用法

    这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...

  2. Android 消息机制 Handler总结

    老久就想着写一篇 关于消息机制的文章来总结一下. Android的消息机制主要是指Handler 的运行机制.我们在开发时有的时候需要在子线程进行耗时的I/o 操作,可能是读取文件或者 访问网络等,有 ...

  3. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...

  4. android 手机内存uri_Android消息机制Handler原理解析

    关注[搜狐技术产品]公众号,第一时间获取技术干货 导读 在Android中,Handler一直是一个热点,在开发过程中,它的使用频率很高,而且在Android源码中Handler都是常客.那么Hand ...

  5. Android消息机制(Handler机制) - 线程的等待和唤醒

    我们都知道,Android的Handler机制,会在线程中开启消息循环,不断的从消息队列中取出消息,这个机制保证了主线程能够及时的接收和处理消息. 通常在消息队列中(MessageQueue)中没有消 ...

  6. android 消息轮训,Android消息机制Handler,有必要再讲一次

    我们在日常开发中,总是不可避免的会用到 Handler,虽说 Handler 机制并不等同于 Android 的消息机制,但 Handler 的消息机制在 Android 开发中早已谙熟于心,非常重要 ...

  7. Android异步消息机制

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...

  8. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  9. Android的消息机制(2)

    上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来.那么如何由别的线程发送消息给主线程的Message Queue中呢? 直接看代码~~ 1 2 3 4 ...

最新文章

  1. python利用什么写模板_Python利用逻辑回归分类实现模板
  2. Android Studio: finished with non-zero exit value2
  3. .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)...
  4. BaseActivity与BaseFragment的封装
  5. python计算最大回撤_最大回撤线性算法实现
  6. html 三大标签,网站三大标签的正确书写
  7. 添加ejs后页面空白解决办法
  8. 局域网如何测试网速手机软件,如何轻松测试局域网网速
  9. BC95-G NB-IOT 模块使用
  10. libcurl入门之相关接口函数curl_easy_getinfo
  11. Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase alpha-numeric characters and
  12. Win11如何设置自动关机
  13. 泛泰A880S再次救砖成功,记录一下
  14. 《MLB棒球创造营》:走近棒球运动·费城费城人队
  15. 20万华人的迪拜:亚洲的另一大Web3之都
  16. 【分布式微服务】消息中心初步搭建
  17. 《论语》原文及其全文翻译 学而篇4
  18. Unity URP管线设置 后处理的使用
  19. karma测试html,常用的前端自动化测试工具介绍 —— Karma(二)
  20. @SpringBootTest注解进行单元测试

热门文章

  1. 华为智慧屏华为正式发布鸿蒙,舒适大屏体验,华为智慧屏SE让智慧生活一步到位...
  2. Web前端和后端开发的区别和要求
  3. Centos安装Oracle数据库文本记录
  4. redis 模糊查找keys
  5. e课表项目第二次冲刺周期第四天
  6. 常用加密算法的Java实现(一)
  7. 71. Merge k Sorted Lists
  8. lazada铺货模式的选品_Lazada的商业模式有哪些?要怎么做?
  9. 基础知识—条件判断语句-if条件类型的语句
  10. python视频教程免费 西西-Python基础教程(第2版)