【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解

简介: 【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解

Handler消息传递

MessageQueue:消息队列。先进先出管理邮件。当Looper对象初始化时,将创建与其关联的MessageQueue;

 int imgids[] = new int[]{  
        R.drawable.s_1, R.drawable.s_2,R.drawable.s_3,  
        R.drawable.s_4,R.drawable.s_5,R.drawable.s_6,  
        R.drawable.s_7,R.drawable.s_8  
    };  
    int imgstart = 0;  

UI线程:我们的主线程。当系统创建UI线程时,它将初始化Looper对象并创建与其关联的MessageQueue;
处理程序:用于发送和处理信息。如果希望处理程序正常工作,则当前线程中必须有Looper对象
Message:处理程序接收并处理的消息对象

Looper:每个线程只能有一个Looper,管理MessageQueue,并不断从中获取消息并将其分发给相应的Handler进行处理!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:id="@+id/RelativeLayout1"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:gravity="center"  
    tools:context="com.jay.example.handlerdemo1.MainActivity" >  
  
    <ImageView  
        android:id="@+id/imgchange"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true" />  
  
</RelativeLayout> 

为了线程安全,Android不允许我们在UI线程之外操作UI;在许多情况下,当我们刷新界面时,我们需要通过Handler通知UI组件进行更新!除了使用Handler更新接口之外,还可以使用runOnUiThread()更新更高级的事务总线

重写handleMessage方法,根据msg中what的值判断是否执行后续操作 :

final Handler myHandler = new Handler()  
    {  
      @Override  
      public void handleMessage(Message msg) {  
        if(msg.what == 0x123)  
           {  
            imgchange.setImageResource(imgids[imgstart++ % 8]);  
           }  
        }  
    };  

当我们的子线程想要修改活动中的UI组件时,我们可以创建一个新的Handler对象,并通过该对象向主线程发送信息;我们发送的信息将进入主线程的MessageQueue等待,Looper将按照先入先出的顺序将其取出,然后根据消息对象的属性将其分发给相应的Handler进行处理!
使用定时器,每隔200毫秒让handler发送一个空信息 :

   @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        final ImageView imgchange = (ImageView) findViewById(R.id.imgchange);  
        
        new Timer().schedule(new TimerTask() {            
            @Override  
            public void run() {  
                myHandler.sendEmptyMessage(0x123);  
                  
            }  
        }, 0,200);  
    }  

相关方法:
无效句柄消息(Message msg):一种处理消息的方法,通常用于重写!
SendEmptyMessage(int what):发送空消息
SendEmptyMessageDelayed(int what,long delayMillis):指定发送空消息的毫秒数
SendMessage(Message msg):立即发送消息
SendMessageDelayed(Message msg):指定延迟发送消息的毫秒数
Final boolean hasMessage(int what):检查消息队列是否包含what属性为指定值的消息。如果参数是(int what,Object Object):除了确定什么属性外,还需要确定对象属性是否是指定对象的消息
启动新线程 :

  @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        etNum = (EditText)findViewById(R.id.etNum);  
        calThread = new CalThread();  
        calThread.start();  
    }  

缓存问题深入运用

页面缓存:加载网页时,html、JS、CSS和其他页面或资源数据。这些缓存资源是由浏览器的行为生成的。开发人员只能通过配置HTTP响应头来影响浏览器的行为,从而间接影响这些缓存数据。缓存的索引位于:/data/data//databases中相应的文件位于:/ddata/data/package_Under-name/cache/webviewCacheChronum中

 btn_clear_cache.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wView.clearCache(true);
            }
        });

数据缓存:有AppCache和DOM存储,它们是开发人员可以自己控制的缓存资源,
AppCache:我们可以有选择地缓冲web浏览器中的所有内容,从页面、图像到脚本、css等等。当涉及应用于网站多个页面的css和JavaScript文件时,它特别有用。其尺寸目前一般为5M。在Android上,需要手动打开(setAppCacheEnabled),并设置路径(setAppCachePath)和容量(setAppCache MaxSize)。在Android上,使用ApplicationCache.db保存AppCache数据!
重写回退按钮的点击事件:

   @Override
    public void onBackPressed() {
        if(wView.canGoBack()){
            wView.goBack();
        }else{
            super.onBackPressed();
        }
    }

DOM存储:存储一些可以通过使用键/值对解决的简单数据。根据应用范围的不同,有两种类型的存储:会话存储和本地存储,用于会话级存储(关闭时页面消失)和本地化存储(除非主动删除数据,否则数据永远不会过期)。在Android中,可以手动打开DOM存储(setDomStorageEnabled),在Android中设置存储路径(setDatabasePath)Webkit将为DOMStorage生成两个文件(my_path/localstorage/http_blog.csdn.net_0.localstorage和my_path/Databases.db)

  super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wView = (WebView) findViewById(R.id.wView);
        btn_clear_cache = (Button) findViewById(R.id.btn_clear_cache);
        btn_refresh = (Button) findViewById(R.id.btn_refresh);
        wView.loadUrl(URL);

还有这些方法:

setting.setCacheMode(WebSettings.LOAD_NO_CACHE);
deleteDatabase("WebView.db");和deleteDatabase("WebViewCache.db");
webView.clearHistory();
webView.clearFormData();
getCacheDir().delete();

我们可以直接操作的是数据部分,而页面缓存是由浏览器的行为生成的。我们只能通过配置HTTP响应头来影响浏览器的行为,从而间接影响这些缓存数据。因此,上述方法只是删除数据的缓存

相关文章
|
19天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
19天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
44 14
|
19天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
20天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
20天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
25 0
|
5天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
118 85
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
82 6
|
2天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
1月前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构