【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响应头来影响浏览器的行为,从而间接影响这些缓存数据。因此,上述方法只是删除数据的缓存

相关文章
|
7天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
4天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
21 7
|
1天前
|
缓存 移动开发 前端开发
HTML5 应用程序缓存详解
HTML5 应用程序缓存(Application Cache)通过缓存 HTML、JavaScript、CSS 和图像等资源,使 Web 应用能在离线状态下运行。它利用 Manifest 文件(`.appcache`)定义缓存资源列表,浏览器会在加载页面时下载并缓存这些资源。此外,应用程序缓存还提供了事件处理机制,允许开发者监控缓存状态并进行手动管理。尽管这一技术已被视为过时,建议使用 Service Workers 和 Cache API 等现代替代方案来实现更强大的离线功能和缓存控制。
|
7天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
4天前
|
缓存 Java Linux
探索安卓开发:从新手到专家的旅程
【9月更文挑战第30天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索安卓开发的广阔世界。无论你是刚入门的新手,还是希望提升技能的开发者,本文都将为你提供宝贵的知识和指导。我们将深入探讨安卓开发的基础知识、关键概念、实用工具和最佳实践,帮助你在安卓开发领域取得更大的成功。让我们一起开启这段精彩的旅程吧!
|
5天前
|
监控 安全 Java
Kotlin 在公司上网监控中的安卓开发应用
在数字化办公环境中,公司对员工上网行为的监控日益重要。Kotlin 作为一种基于 JVM 的编程语言,具备简洁、安全、高效的特性,已成为安卓开发的首选语言之一。通过网络请求拦截,Kotlin 可实现网址监控、访问时间记录等功能,满足公司上网监控需求。其简洁性有助于快速构建强大的监控应用,并便于后续维护与扩展。因此,Kotlin 在安卓上网监控应用开发中展现出广阔前景。
9 1
|
8天前
|
搜索推荐 前端开发 Android开发
安卓开发中的自定义视图:打造个性化用户界面
【9月更文挑战第26天】在移动应用开发的广阔天地中,定制性是提升用户体验的不二法宝。本文将带你深入了解安卓开发中自定义视图的魅力所在,通过简洁明了的语言和直观的代码示例,展示如何从零开始创建属于自己的控件,让你的应用界面与众不同。
|
5月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
369 1
|
2月前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
2月前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。