Android在子線程更新UI主線程的6種方法

效果描述:

點擊按鈕後,按鈕切換爲不可點擊狀態,6個任務依次執行(線程池實現),待6個任務全部執行完成之後,按鈕狀態切換可用,可在此執行前述操作。

 

public class UpgradeUI implements Runnable {
    // 調用任務進度
    protected void onProgress(int value){

    }
    // 任務結束調用
    protected void onFinish(Object ... args){

    }
    @Override
    public void run() {
        int i=0;
        while(i<100){
            i++;
            try {
                // 模擬任務耗時
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 通知任務進度
            onProgress(i);
        }
        // 通知任務結束
        onFinish();

    }
}

public class TestSubThreadActivity extends AppCompatActivity {


    private static final String TAG = "TestSubThreadActivity";
    private EditText editText;
    private ProgressBar progressBar;
    private LinearLayout lp;
    int index = 0;


    static CountDownLatch countDownLatch = new CountDownLatch(6);
    // 使用handler更新UI
    Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            progressBar.setProgress(msg.arg1);
        }
    };

    // handler message
    UpgradeUI upgradeUI = new UpgradeUI() {
        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
        @Override
        protected void onProgress(int value) {
            Message message = new Message();
            message.arg1 = value;
            handler.sendMessage(message);
        }
    };

    // 使用runOnUiThread
    UpgradeUI upgradeUI1 = new UpgradeUI() {
        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
        @Override
        protected void onProgress(int value) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(value);
                    editText.setText("使用runOnUiThread");
                }
            });
        }
    };

    // 使用rhandler.post
    UpgradeUI upgradeUI2 = new UpgradeUI() {
        @Override
        protected void onProgress(int value) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(value);
                    editText.setText("使用rhandler.post");
                }
            });
        }

        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
    };

    // 使用handler postDelay延時1s更新
    UpgradeUI upgradeUI3 = new UpgradeUI() {
        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
        @Override
        protected void onProgress(int value) {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(value);
                    editText.setText("使用handler postDelay延時1s更新");
                }
            }, 1000);
        }
    };

    // 通過view.post
    UpgradeUI upgradeUI4 = new UpgradeUI() {
        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
        @Override
        protected void onProgress(int value) {
            progressBar.post(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(value);
                    editText.setText("通過view.post");
                }
            });
        }
    };
    // by syncTask
    UpgradeUI upgradeUI5 = new UpgradeUI() {
        @Override
        protected void onFinish(Object... args) {
            countDownLatch.countDown();
        }
        @Override
        protected void onProgress(int value) {
            AsyncTask asyncTask = new AsyncTask() {
                @Override
                protected Object doInBackground(Object[] objects) {
                    return null;
                }

                @Override
                protected void onPostExecute(Object o) {
                    progressBar.setProgress(value);
                    editText.setText("by syncTask");
                    super.onPostExecute(o);
                }
            }.executeOnExecutor(executor);
        }
    };

    // 線程池,每次執行一個線程,可設置
    Executor executor = Executors.newSingleThreadExecutor();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_sub_thread);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        editText = findViewById(R.id.editText);
        progressBar = findViewById(R.id.progressBar);
        lp = findViewById(R.id.lp);
//        progressBar.animate().start();


        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    public void confirm(View view) {

        // 設置按鈕不可點擊
        view.setClickable(false);
        editText.setText("handle message!");

        executor.execute(upgradeUI);
        executor.execute(upgradeUI1);
        executor.execute(upgradeUI2);
        executor.execute(upgradeUI3);
        executor.execute(upgradeUI4);
        executor.execute(upgradeUI5);


        // 所有的更新UI線程執行結束,按鈕恢復點擊
        new AsyncTask<Object,Integer,Object>(){
            @Override
            protected Object doInBackground(Object... objects) {
                try {
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
                view.setClickable(true);
            }
        }.execute();
    }
}

 

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