Android Studio學習隨筆-UI線程阻塞以及優化

来源:http://www.cnblogs.com/hesichao/archive/2016/05/29/5539388.html
-Advertisement-
Play Games

我們在使用手機的時候,經常會遇到一個問題:先是卡死,然後跳出該程式無響應,是否關閉的提示(當然有可能是我們手機性能太差=。=)這是因為線程的阻塞引起的,在這裡我講述一下UI線程,一般處理程式會在UI線程中執行耗時操作,這回導致UI線程阻塞,當UI線程阻塞,屏幕會出現卡死,用戶體驗會變得非常差,當線程 ...


我們在使用手機的時候,經常會遇到一個問題:先是卡死,然後跳出該程式無響應,是否關閉的提示(當然有可能是我們手機性能太差=。=)這是因為線程的阻塞引起的,在這裡我講述一下UI線程,一般處理程式會在UI線程中執行耗時操作,這回導致UI線程阻塞,當UI線程阻塞,屏幕會出現卡死,用戶體驗會變得非常差,當線程阻塞超過5s,android系統可能進行干預,彈出對話框詢問是否關閉。那如何解決呢?

解決方案一:創建一個新線程

我在UI視圖中創建了一個button和一個textView

 
    Button button=(Button)findViewById (R.id.button);
       TextView textView=(TextView)findViewById(R.id.textView);

        TranslateAnimation animation=new TranslateAnimation(0,200,0,0);
        animation.setRepeatCount(3);
        animation.setDuration(2000);
        textView.setAnimation(animation);
      //這裡我讓textView在進入app時進行移動動畫

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {//監聽button的點擊
                new Thread(new Runnable() {//創建一個新線程
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(5000);//在這裡我讓線程進行耗時操作
                        }
                        catch (InterruptedException e){
                e.printStackTrace();
              } } }).start(); }
   });

上面的代碼我創建一個新的線程來實現耗時,但是實際過程中進行的不可能只是一個耗時操作,讓我們在新線程中加兩句話,TextView view=(TextView)v;view.setText(""+100);(獲取到當前控制項,並將其文字設置成100)現在讓我們再來試試這個程式,這個時候程式又報錯了

Only the original thread that created a view hierarchy can touch its views.

 

翻譯成中文就是:只有創建view的那個線程才能對其進行修改。

其實谷歌有兩條建議,也可以說是規矩

there are simply two rules to Android's single thread model:
    Do not block the Ui thread//不要阻塞UI線程
    Do not access the Android UI toolkit from outside the UI thread//不要在UI線程外的其他線程對視圖中的組件進行設置

那麼很多人就有疑問了,這不是矛盾了嗎?谷歌也為我們提供瞭解決方案

解決方案一:view.post

上面代碼出錯是因為我們在UI之外的線程調用了UI控制項;那麼現在,我們在try{}catch(){}語句後增加一下代碼

1      v.post(new Runnable() {
2                            @Override
3                            public void run() {
4                                TextView view=(TextView)v;
5                                view.setText(""+sun);
6                            }
7                        });

 

這段代碼將我的語句提交到了UI線程中;但是view.post也有一些缺點

冗餘,可讀性差,維護性差

 為此官方也提供了另外一種解決方法

解決方法二:AsyncTask

AsyncTask和post方法大同小異

  private class DownloadImageTask extends  AsyncTask<String ,Void,Integer>{
        protected Integer   doInBackground(String...urls){
            try{
                Thread.sleep(5000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            int sun=100;
            return  sun;
        }
        protected void onPostExecute(Integer sum){
            button2.setText(""+sum);
        }
    }

 

button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadImageTask().execute();
                }
           });

 

我們現在外部創建一個方法,然後在button的onClick事件中引用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近除了做業務,也在嘗試學習h5和移動端,在這個過程中,學到了很多,利用h5和canvas做了一個愛心魚的小游戲。 "點這裡去玩一下" PS: 貌似有點閃屏,親測多刷新兩下就好了==。代碼在本地跑都不會閃,放到博客里就閃了,我也不知道為什麼。。。回頭我再看看是什麼問題。 另外,我把代碼放到githu ...
  • 學習要點: 1.搜索區 2.插入大圖 3.搜索框 主講教師:李炎恢 本章主要開始使用學慣用 HTML5 和 CSS3 來構建 Web 頁面,第一個項目採用 PC 端固定佈局來實現。 一.搜索區 本節課,我們接著 header 頭部往下,來設計一塊搜索區。這個區域,可以是廣告大圖,也可以是用戶註冊,也 ...
  • 效果:http://hovertree.com/texiao/jquery/71/代碼如下: 轉自:http://hovertree.com/h/bjaf/n781jmfy.htm 特效彙總:http://www.cnblogs.com/roucheng/p/texiao.html ...
  • 大圖:http://images2015.cnblogs.com/blog/730765/201605/730765-20160529113743209-72994369.png ...
  • 1. PCH文件概述 PCH文件是一種預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)里。這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼。 在 Xc ...
  • 看了很多別人寫的安卓SQlite數據的操作代碼,都是浮雲,瞎弄!一點也不通俗易懂,我覺得我寫的不錯,而且安卓項目也用上了,所以在博客園裡保存分享一下! 一SQLiteHelper類是自動重載增刪改查函數的,另外一個是自己定義的類,用Context傳值。我用的是Fragment,用Activity的話 ...
  • 此前編譯過Android4.4的源碼,但是現在Android都到了7.0的版本,不禁讓我感嘆Google的步伐真心難跟上,趁這周周末時間比較充裕,於是在過去的24小時里,毅然花了9個小時編譯了一把Android6.0的源碼,但是昨天編譯完之後已經很晚了,沒來得及記錄編譯的步驟,今天才慢悠悠地來記錄一 ...
  • 教你如何在 Android 使用多線程下載文件 =============================================== 前言 在 Android 日常開發中,我們會經常遇到下載文件需求,這裡我們也可以用系統自帶的 api 來解決這個問題,當然我們也可以自己來寫。在這裡我將教大 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...