"Android学习笔记,主要讲解了线程阻塞UI更新的问题,包括查看网络图片、主线程阻塞(ANR)、使用Handler刷新UI、本地缓存图片、获取开源代码、构建新闻客户端、以及使用GET和POST方式提交表单数据等关键知识点。" 在Android应用开发中,线程管理和UI更新是非常核心的技能。以下是对这些知识点的详细解释: 1. 查看网络上的图片:当应用程序需要加载网络图片时,通常会通过HTTP请求获取。在示例代码中,使用`URL`和`HttpURLConnection`创建网络连接,设置请求方法为"GET",并设置超时时间。一旦响应码为200,表示请求成功,通过`InputStream`读取数据并用`BitmapFactory.decodeStream()`将流转换为Bitmap,最后在ImageView中显示。 2. 主线程阻塞-ANR(Application Not Responding):Android系统规定,主线程(UI线程)负责处理用户交互和绘制界面。如果主线程执行耗时操作,如网络请求,会导致界面无响应,引发ANR错误。从Android 2.3开始,对主线程的限制更加严格,建议在其他工作线程中执行耗时操作。 3. 刷新UI-Handler:为了不阻塞主线程,我们可以使用Handler来异步处理任务。Handler与Looper、MessageQueue协同工作,通过发送Message到消息队列,由主线程的Looper取出并分发给对应的Handler处理。这样可以在不影响主线程的情况下更新UI。 4. 在本地缓存图片:为了避免频繁的网络请求,提高用户体验,应用通常会将下载过的图片缓存在本地。例如微信就使用了本地缓存策略。可以使用SQLite数据库、文件系统或第三方库如LruCache来实现。 5. 获取开源代码:学习和借鉴开源项目可以帮助开发者提升技能,如Universal Image Loader、Glide或Picasso等库,它们提供了高效的图片加载和缓存机制。 6. 显示一个新闻客户端:构建新闻客户端涉及网络请求、JSON解析、Adapter和ListView/RecyclerView等组件的使用,以及可能的下拉刷新和无限滚动功能。 7. 使用GET方式提交表单数据:GET是HTTP的一种请求方法,用于从服务器获取数据。在Android中,可以通过`HttpURLConnection`或`OkHttp`等库发起GET请求,获取服务器返回的数据。 8. 使用POST方式提交表单:POST方法常用于向服务器提交数据。在Android中,可以设置`setDoOutput(true)`,然后通过`OutputStream`写入数据,实现POST请求。 理解以上知识点,对于开发高效且响应迅速的Android应用至关重要。在实际开发中,还需要结合实际需求,选择合适的网络库(如Volley、Retrofit或OkHttp)和图片加载库,以及优化内存管理和性能,避免内存泄漏和ANR问题。同时,遵循Android设计原则和最佳实践,确保应用程序的稳定性和用户体验。
客户端发送http请求至服务器,如果请求成功,响应码为200,服务器会通过流向客户端返回请求的数据
例如:
//按键监听事件
public void click(View v){
String path = "http://localhost:8080/test.jpg";
//发送http请求
try {
URL url = new URL(path);//使用网址构造一个URL对象
//获取连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置一些属性
conn.setRequestMethod("GET");//设置请求方式,注意大小写
conn.setConnectTimeout(5000);//设置请求超时
conn.setReadTimeout(5000);//设置读取超时
conn.connect();//发送请求,建立连接
//判断请求是否成功
if(conn.getResponseCode() == 200){
//获取服务器返回的流,流里就是客户端请求的数据
InputStream is = conn.getInputStream();
//读取流里的数据,构造出一张图片
Bitmap bm = BitmapFactory.decodeStream(is);
//将下载的图片显示至imageview
iv.setImageBitmap(bm);
}
else{
Toast.makeText(this, "请求失败", 0).show();
}
} catch (Exception e) {
e.printStackTrace();
}
2、主线程阻塞-ANR
http请求的代码写在主线程,在2.3上可以运行,但是在4.3以后就不行,提示不能再主线程运行
因为http是一个耗时的操作,会导致主线程阻塞
3、刷新UI-Handler
子线程是不能刷新UI的,必须使用主线程刷新,我们这个时候就需要使用消息队列MessageQueue,我们子线程只需要发送消息就行。
消息发送到主线程需要用Handler这个类去处理,里面使用handleMessage的方法
a、定义一个全局变量:handler
Handler handler = new Handler(){
//只要消息队列有消息,此方法就会在主线程执行
public void handleMessage(android.os.Message msg) {
//在这里刷新ui
switch (msg.what) {
case 1:
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap((Bitmap)msg.obj);//在UI上显示图片
剩余7页未读,继续阅读
- 粉丝: 53
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展