Thread執行緒,往往在執行耗時程序的時候會使用到,若都由主執行緒來執行,可能會導致阻塞很久無法繼續運作,多執行緒的能力還是有效提高了程式執行的效率及使用者體驗,但通常還是盡量減少執行緒的數量,因為還是會些微影響系統的速度及記憶體空間,那麼首先先進入到java的執行緒。
因為android在執行緒中修改ui的話是不被允許的,但可以透過Looper、runOnUiThread在執行緒中更新你的ui。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(getApplicationContext(),"abc",Toast.LENGTH_SHORT).show();
Looper.loop();
// runOnUiThread(()->{
// Toast.makeText(getApplicationContext(),"cba",Toast.LENGTH_SHORT).show();
// });
}
});
//執行緒開始
thread.start();
//isAlive 判斷目前執行緒是否執行中
Log.d("Thread",""+thread.isAlive());
//當有多個執行緒時,使用join會有中斷問題(InterruptedException)
// try {
// thread.join();
// ...join
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
與Thread一樣也會去實作Runnable的run方法運行,也有wait與notify的方法,我自己是比較常用到以下的兩種執行handler的寫法:
//Handler
Handler handler = new Handler();
//無延遲執行
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"handler1!",Toast.LENGTH_SHORT).show();
}
});
//延遲1秒執行
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"handler2!",Toast.LENGTH_SHORT).show();
}
},1000);
而另外也有許多會用到message的方法,如果想了解更多的可以點這邊:Android Developers
Coroutines(協程),與Thread類似,比較不同的是:協程是協作式處理,線程Thread是搶佔式處理,協程可透過其他協程的調用來進行轉換(會保持狀態),以此來並行運作,大約有runBlocking,coroutineScope,withContext等
,另外也有asyncTask能用來處理耗時任務,接著就簡單的進行使用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//runBlocking(阻塞的coroutine)
runBlocking {
//launch為內部、順序執行
launch{
Log.d("LOGTAG","runBlocking1")
}
launch{
Log.d("LOGTAG","runBlocking2")
}
}
//coroutineScope launch(內部新增一個協程,順序執行)
GlobalScope.launch {
Log.d("LOGTAG","GlobalScope")
}
//Dispatchers.Main=主線程執行
CoroutineScope(Dispatchers.Main).launch{
Log.d("LOGTAG","CoroutineScope")
}
//Dispatchers.Default=預設(不會跑在主線程)
CoroutineScope(Dispatchers.Default).launch {
abc()
}
}
}
//withContext可切換Dispatcher
suspend fun abc() = withContext(Dispatchers.Default) {
Log.d("LOGTAG","withContext")
}
假如這些coroutines的關鍵字是紅字的話,可能需要在gradle內加入coroutines的依賴:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0"