Android笔记 消息机制handler+http之 网络图片浏览器demo
在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相关推荐
- Android消息机制Handler用法
这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...
- Android 消息机制 Handler总结
老久就想着写一篇 关于消息机制的文章来总结一下. Android的消息机制主要是指Handler 的运行机制.我们在开发时有的时候需要在子线程进行耗时的I/o 操作,可能是读取文件或者 访问网络等,有 ...
- 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制
第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...
- android 手机内存uri_Android消息机制Handler原理解析
关注[搜狐技术产品]公众号,第一时间获取技术干货 导读 在Android中,Handler一直是一个热点,在开发过程中,它的使用频率很高,而且在Android源码中Handler都是常客.那么Hand ...
- Android消息机制(Handler机制) - 线程的等待和唤醒
我们都知道,Android的Handler机制,会在线程中开启消息循环,不断的从消息队列中取出消息,这个机制保证了主线程能够及时的接收和处理消息. 通常在消息队列中(MessageQueue)中没有消 ...
- android 消息轮训,Android消息机制Handler,有必要再讲一次
我们在日常开发中,总是不可避免的会用到 Handler,虽说 Handler 机制并不等同于 Android 的消息机制,但 Handler 的消息机制在 Android 开发中早已谙熟于心,非常重要 ...
- Android异步消息机制
2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...
- Android 开发艺术探索——第十章 Android的消息机制
Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...
- Android的消息机制(2)
上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来.那么如何由别的线程发送消息给主线程的Message Queue中呢? 直接看代码~~ 1 2 3 4 ...
最新文章
- python利用什么写模板_Python利用逻辑回归分类实现模板
- Android Studio: finished with non-zero exit value2
- .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)...
- BaseActivity与BaseFragment的封装
- python计算最大回撤_最大回撤线性算法实现
- html 三大标签,网站三大标签的正确书写
- 添加ejs后页面空白解决办法
- 局域网如何测试网速手机软件,如何轻松测试局域网网速
- BC95-G NB-IOT 模块使用
- libcurl入门之相关接口函数curl_easy_getinfo
- Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase alpha-numeric characters and
- Win11如何设置自动关机
- 泛泰A880S再次救砖成功,记录一下
- 《MLB棒球创造营》:走近棒球运动·费城费城人队
- 20万华人的迪拜:亚洲的另一大Web3之都
- 【分布式微服务】消息中心初步搭建
- 《论语》原文及其全文翻译 学而篇4
- Unity URP管线设置 后处理的使用
- karma测试html,常用的前端自动化测试工具介绍 —— Karma(二)
- @SpringBootTest注解进行单元测试
热门文章
- 华为智慧屏华为正式发布鸿蒙,舒适大屏体验,华为智慧屏SE让智慧生活一步到位...
- Web前端和后端开发的区别和要求
- Centos安装Oracle数据库文本记录
- redis 模糊查找keys
- e课表项目第二次冲刺周期第四天
- 常用加密算法的Java实现(一)
- 71. Merge k Sorted Lists
- lazada铺货模式的选品_Lazada的商业模式有哪些?要怎么做?
- 基础知识—条件判断语句-if条件类型的语句
- python视频教程免费 西西-Python基础教程(第2版)