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
JAVA多執行緒實現子執行緒迴圈10次,接著主執行緒迴圈100,接著又回到子執行緒迴圈10次,接著再回到主執行緒又迴圈100,如此迴圈50次
package com.study; public class Demo001 { public static v