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

相关文章
|
4天前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
12 0
|
2月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
76 1
|
2月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
27 1
|
2月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
25 0
|
2月前
|
Android开发 开发者 iOS开发
APP开发后如何上架,上架Android应用市场前要准备什么
移动应用程序(APP)的开发已经成为现代企业和开发者的常见实践。然而,开发一个成功的APP只是第一步,将其上架到应用商店让用户下载和使用是实现其潜力的关键一步。
|
25天前
|
缓存 Java 数据库
优化您的Spring应用程序:缓存注解的精要指南
优化您的Spring应用程序:缓存注解的精要指南
25 0
|
1天前
|
存储 SQL 数据库
安卓移动应用开发(安卓系统开发教程)
安卓移动应用开发(安卓系统开发教程)
|
4天前
|
Java Android开发 C++
安卓SO层开发 -- 第一个NDK项目
安卓SO层开发 -- 第一个NDK项目
6 0
|
4天前
|
算法 Java Android开发
安卓逆向 -- NDK开发实现MD5算法
安卓逆向 -- NDK开发实现MD5算法
10 0
|
27天前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
22 0

热门文章

最新文章

相关产品

  • 云迁移中心