前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解

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

作者头像
上进小菜猪
发布2022-12-25 09:50:33
3320
发布2022-12-25 09:50:33
举报

Handler消息传递

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

代码语言:javascript
复制
 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进行处理!

代码语言:javascript
复制
<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的值判断是否执行后续操作 :

代码语言:javascript
复制
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发送一个空信息 :

代码语言:javascript
复制
   @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):除了确定什么属性外,还需要确定对象属性是否是指定对象的消息 启动新线程 :

代码语言:javascript
复制
  @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中

代码语言:javascript
复制
 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数据! 重写回退按钮的点击事件:

代码语言:javascript
复制
   @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)

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Handler消息传递
  • 缓存问题深入运用
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档