安卓——多線程

安卓的多線程和java的多線程操作一樣


有兩種實現方法:

  • 繼承Thread類,重寫run方法

  • 實現Runnable接口,重寫run方法

兩種方法的線程啓動需要調用start方法而不是run,否則相當於一個普通方法而非線程


繼承Thread類:直接new然後調用start方法

    //第一種實現子線程的方法:繼承Thread類
    private class MyThread extends Thread{
        @Override
        public void run() {

            //網絡操作必須放在子線程
            //打印當前線程的名稱
            Log.e("MyThread的run方法",Thread.currentThread().getName());
            //run方法的執行所在的線程是子線程,可以執行耗時操作
            result = fib(25);
            Log.e("斐波那契數列第n項的值爲:",  result + "");

            //2.發送計算結果給UI線程,並將結果顯示在UI界面
            Message message = new Message();
            message.what = 100;//區分不同的消息對象
            message.obj = result;//發送的數據本身
            mainHandler.sendMessage(message);//發送消息,進入主線程的消息隊列

            //在子線程中不允許修改UI
//            String result = fib(5) + "";
//            resultTv.setText(result);
        }
    }
    new MyThread().start();

實現Runnable接口:new出來當作Thread類的構造參數,再調用start方法

//第二種實現子線程的方式:實現Runnable(任務)接口
    private class MyRunnable implements Runnable{
        @Override
        public void run() {
            Log.e("MyRunnable","run方法");
            Log.e("MyRunnable",Thread.currentThread().getName());
        }
    }
    new Thread(new MyRunnable()).start();//子線程

注意:在子線程中無法操作Activity的組件,想操作需要藉助Handler

需要一下三步:

  • 創建Handler的匿名子類對象

  • 發送消息給UI線程

  • 處理信息

    //1、主線程中去創建Handler匿名子類對象
    private Handler mainHandler = new Handler(){
        @Override
        //3.處理Message
        public void handleMessage(@NonNull Message msg) {
            Log.e("handleMessage方法",Thread.currentThread().getName());
            switch (msg.what){
                case 100:
                    resultTv.setText(msg.obj + "");
                    break;
            }
        }
    };
	//2.發送計算結果給UI線程,並將結果顯示在UI界面
	Message message = new Message();
    message.what = 100;//區分不同的消息對象
    message.obj = result;//發送的數據本身
	mainHandler.sendMessage(message);//發送消息,進入主線程的消息隊列

PS:網絡操作等耗時操作必須放在子線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章