1. 程式人生 > >Android 幾種非同步方式,解決主執行緒中遇到的卡頓

Android 幾種非同步方式,解決主執行緒中遇到的卡頓

起因:

當我們的UI越來越複雜的時候,或者說某個業務需要大量的計算的時候,我們的主執行緒會消耗大量的資源去計算,這個時候,我們的Activity或者說fragmemt等UI頁面就會出現卡頓,乃至ANR。總結一下,就是我們直接在主執行緒(UI執行緒)中,做耗時操作,就會造成卡頓,甚至ANR

解決方案:

1.優化耗時的計算,提高演算法,利用快取等資料;這種方式,一般帶來的提升在App這種場景中微乎其微,只有在大規模的併發場景中才會體現出效果(伺服器後臺服務中),打個比方,你存一年1W塊錢的定期,一年利息才200多塊,當你存1000W的時候,一年利息就有20多W,這種效果才明顯(手動滑稽)

2.利用非同步的方式,簡單來說,開啟另外一個執行緒去做耗時操作,利用CPU的多執行緒模式,這樣我們的主執行緒就不會卡頓在耗時操作中

非同步的方式:

1.直接使用繼承Thread類或者實現Runable介面(和主執行緒通訊還得使用handler)

2.AsyscTask(它的原理主要是利用執行緒池,各個歷史版本系統版本可能會有不同的缺陷)

3.利用Handler,Message,Looper(主執行緒預設開啟了Looper)

4.RxJava 執行緒模式.subscribeOn(Schedulers.io()),這樣可以開啟一個新執行緒來執行裡面的耗時程式碼

嚴格的地來說,Android裡面,主執行緒和子執行緒之間,不能使用sleep(),wait(),notify()等Java原生的執行緒通訊的方式,因為,主執行緒一旦sleep那麼整個App都不能正常執行(所有的Activity,Service等都在主執行緒執行中呢)

相關推薦

Android 非同步方式解決執行遇到的卡

起因: 當我們的UI越來越複雜的時候,或者說某個業務需要大量的計算的時候,我們的主執行緒會消耗大量的資源去計算,這個時候,我們的Activity或者說fragmemt等UI頁面就會出現卡頓,乃至ANR。總結一下,就是我們直接在主執行緒(UI執行緒)中,做耗時操作,就會造成卡

【java基礎】多執行匿名內部類和lambda建立方式及多執行的兩個面試題

一、可以用匿名類和lambda兩個種方式建立多執行緒。 1.利用匿名內部類建立多執行緒並開啟。 new Thread() {//建立方式1 public void run() { for(int x=0; x<50; x++) { System.out

jmeter ---json讀取方式ArrayList循環讀取

導入 一起 .com json數據格式 jmeter ips pos processor 直接   在之前寫過提取json數據格式的文章,這次對jmeter讀取json數據格式進行整理。   舉例一個接口的response 格式如下: { "data" : {

微軟 WCF的寄宿方式寄宿IIS、寄宿winform、寄宿控制臺、寄宿Windows服務

創建 src 體驗 ash pos 如果 理解 文件 .get WCF寄宿方式是一種非常靈活的操作,可以在IIS服務、Windows服務、Winform程序、控制臺程序中進行寄宿,從而實現WCF服務的運行,為調用者方便、高效提供服務調用。本文分別對這幾種方式進行詳細介紹並開

Python讀寫檔案的不同方式特別對出現‘b’的解讀

一、Python檔案讀寫的幾種模式: 'r':預設值,表示從檔案讀取資料。 'w':表示要向檔案寫入資料,並截斷以前的內容 'a':表示要向檔案寫入資料,新增到當前內容尾部 'r+':表示對檔案進行可讀寫操作(刪除以前的所有資料) 'r+a':表示對檔案可進行讀寫操作(新增到當前檔案尾部)

Selenium等待方式需特別注意implicitlyWait的用法

最近在專案過程中使用selenium 判斷元素是否存在的時候 遇到一個很坑爹的問題, 用以下方法執行的時候每次都會等待很長一段時間,原因是因為對selenium實現方法瞭解不足導致一直找不到解決方法。   private boolean isElementPresent(By by) {      tr

Service 的兩啟動方式以及在音樂播放的使用

 首先,簡要介紹一下service    service就是android系統中的服務,它有這麼幾個特點:它無法與使用者直接進行互動、它必須由使用者或者其他程式顯式的啟動、它的優先順序比較高, 它比處於前臺的應用優先順序低,但是比後臺的其他應用優先順序高,這就決定了當系統因

Android面試:執行的Looper.loop()一直無限迴圈為什麼不會造成ANR?(轉)

  引子: 正如我們所知,在android中如果主執行緒中進行耗時操作會引發ANR(Application Not Responding)異常。 造成ANR的原因一般有兩種: 只有當應用程式的UI執行緒響應超時才會引起ANR,超時產生原因一般有兩種 1. 當前的事件沒有機會

android執行Looper.loop()為什麼不會造成程式ANR

程式入口為ActivityThread的main方法,原始碼如下: frameworks/base/core/java/android/app/ActivityThread.java public static void main(String[] args) { S

執行---三建立方式例項;以及執行池的使用

1、繼承Thread類 繼承Thread類,重寫run方法(即要讓執行緒進行的操作), 建立執行緒例項,呼叫start()方法啟動執行緒。 import java.util.Date; /** * @author: ycz * @date: 2018/11/25 0025

併發伺服器三實現方式之程序、執行和select

  前言:剛開始學網路程式設計,都會先寫一個客戶端和服務端,不知道你們有沒有試一下:再開啟一下客戶端,是連不上服務端的。還有一個問題不知道你們發現沒:有時啟伺服器,會提示“Address already in use”,過一會就好了,想過為啥麼?在這篇部落格會解釋這個問題。   但現實的伺服器都會連很多客戶

[轉]Android限制只能在執行進行UI訪問的實現原理

目錄 Android限制只能在主執行緒中進行UI訪問 Thread的實現 Android Thread 的構造方法 Android Thread 的start()方法 如何在我們自己的程式碼中去檢測當前Thread是不是UI執

WebTool 網頁資訊獲取可在執行呼叫

WebTool.java package sci.tool; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; import java.net.U

ThreadPool執行池使用及解決執行和子執行執行順序問題

 執行緒池建立五個執行緒,每個執行緒往list中新增100個元素。synchronized只鎖執行緒共享變數list物件,程式碼段內僅新增元素及列印資訊。設定10ms睡眠時間給其餘執行緒機會。 ExecutorService fixedThreadPool = Execut

Java定時任務的方法(Thread 和 Timer,執行池)

/**   * 普通thread   * 這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著,   * 通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如

問題描述: android.os.NetworkOnMainThreadException異常(不要在執行訪問網路資源)

問題描述: android.os.NetworkOnMainThreadException異常(不要在主執行緒訪問網路資源) 問題分析: 造成這種異常的原因是安卓版本問題(仔細研究錯誤原因是程式碼不符合Android規範),網上搜索發現:android3.0版本開始(具體是

Android執行延時處理

Android對UI主執行緒開啟了實時監聽,Activity Manager和WindowManager系統服務一旦監聽到主執行緒超過10秒沒有響應操作,就會丟擲ANR,所以,在UI主執行緒中不能直接呼叫Thread.sleep方法去延時,超過10秒就根本不會執

java多執行的6實現方式詳解、執行池、定時器

多執行緒的形式上實現方式主要有兩種,一種是繼承Thread類,一種是實現Runnable介面。本質上實現方式都是來實現執行緒任務,然後啟動執行緒執行執行緒任務(這裡的執行緒任務實際上就是run方法)。這裡所說的6種,實際上都是在以上兩種的基礎上的一些變形。 繼承Thread

Handler寫在執行使用Message傳遞訊息

Runnable是一個介面,Thread是Runnable的子類。 Message Message 是線上程之間傳遞的訊息,它可以在內部攜帶少量的資訊,用於在不同執行緒之間交換資料。 Ha