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

2022-12-25 09:50:33 浏览数 (2)

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

0 人点赞