Android非同期


글을 쓸 땐 제목부터 써놓자... 다른페이지 뒤로가기 눌렀는데 여기서 뒤로가기 눌려져서 다 날라가지 않도록,,,,Thread
すべてのコードを上から下へ順に(同期)
Thread非同期を使用した複数のタスクの処理
複数のタスクを処理しながら交代しているように見えますa.k.a 일반 thread, 개발자가 만든 thread, worker thread, 작업자 스레드 Main Thread
Activityのコードを処理するために、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
  • Params:doInBackgroundのパラメータタイプ、executeメソッドパラメータ値
  • Progress:onProgress更新のパラメータタイプ
  • Result:doInBackgroundの戻り値、onPostExecuteのパラメータタイプ