Android非同期
글을 쓸 땐 제목부터 써놓자... 다른페이지 뒤로가기 눌렀는데 여기서 뒤로가기 눌려져서 다 날라가지 않도록,,,,
Threadすべてのコードを上から下へ順に(同期)
Thread非同期を使用した複数のタスクの処理
複数のタスクを処理しながら交代しているように見えます
a.k.a 일반 thread, 개발자가 만든 thread, worker thread, 작업자 스레드
Main ThreadActivityのコードを処理するために、Android OSはMain Thread(UI Thread)と呼ばれるスレッドを生成します.
画面は、Main Threadが動作していない場合にのみ使用できます.
ANR(アプリケーションが応答せず、応答なし)
メインThreadが忙しい場合、タッチまたはスクリーン操作によってANRが発生する可能性があります
onCreateで無限ループを回転し、、、
注意する
スレッドが8.0未満のアンドロイドオーディオで画面を処理すると、エラーが発生します.
8.0以降のバージョンでは、開発者が起動したスレッドで画面処理を行うことができます.
->Android OSを刺激するメインスレッドに移行して処理
⚠注意2⚠
Main Threadでネットワーク通信を含む5秒以上のタスクを処理するとANRが発生する場合があります
->通常のthreadで処理
Handler
スケジューリングタスクを繰り返し実行するコード(メインスレッドで処理)が必要です.
Threadを使用した場合のスクリーン処理(アンドロイド8.0以下)
HandlerからAndroidにこのコードをMain Threadに処理するように要求
このタスクは、Androidオペレーティングシステム(Main Thread)がアイドルの場合に処理されます.
途中で休憩時間が発生し、画面操作が処理されます.
Handlerを使用すると、プライマリ・スレッドで特定のコードを繰り返し動作させることができます.
重複タスクの例
class MainActivity : AppCompatActivity() {
val handler : Handler? = null
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handler = Handler()
val thread = ThreadClass()
handler?.post(thread)
}
inner class ThreadClass: Thread() {
override fun run() {
handler?.post(this)
}
}
}
画面処理例class MainActivity : AppCompatActivity() {
val handler : Handler? = null
val isRunning = false
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handler = DisplayHandler()
isRunning = true
val thread = ThreadClass()
thread.start()
}
inner class ThreadClass: Thread() {
override fun run() {
while(isRunning) {
handler?.sendEmptyMessage(0)
}
}
}
inner class DisplayHandler: Handler() {
override fun handleMeassage(msg: Message) {
// 화면 작업
}
}
override fun onDestroy() {
super.onDestroy()
isRunning = false
}
}
中間要約Main Thread処理のコードが5秒を超えると、ANR励起が強制的に終了する可能性があります.
質問:通常のThreadでは画面を処理できません(Android 8.0未満)
->通常のThreadを使用する場合は、Handlerを使用して画面に関連するコンテンツを処理できます.
Handlerが5秒もしない
빨리 끝나는 작업
と반복
をしようとすると継続使用
시간 상관없이
はThread(ネットワーク関連処理、5秒以上かかる)Threadタスクで
화면처리
が必要なのはHandler(Main Thread)AsyncTask
警告:Android 11(APIレベル30)から破棄されました
グローティンの使用を推奨
非同期処理用クラス
開発者によって励起されたThreadとHandlerの組合せは,Thread動作中にスクリーン処理が可能なクラス構造を提供する.
AsyncTaskを使用すると、開発者が生成した通常のスレッドをスクリーン処理用のMain Threadと組み合わせることができます.
4つの方法を使用
onPreExecute
doInBackgroundメソッドを呼び出す前に呼び出すメソッド
Main Thread処理
doInBackground
新しいThreadオカレンス(通常のThread)
onProgressUpdate
doInBackgroundメソッドで画面処理が必要な場合に使用
onPostExecute
メソッド完了後に呼び出す
Main Thread処理
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val async = AsyncTaskClass()
async.execute()
}
inner class AsyncTaskClass: AsyncTask <Int, Long, String>() {
override fun onPreExecute() {
super.onPreExecute()
}
override fun doInBackground(varag p0: Int?): String {
return ""
}
override fun onProgressUpdate(varag values: Long?) {
super.onProgressUpdate(*values)
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
}
}
}
AsyncTask Reference
この問題について(Android非同期), 我々は、より多くの情報をここで見つけました https://velog.io/@3bin/Android-비동기화テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol