效果描述:
點擊按鈕後,按鈕切換爲不可點擊狀態,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();
}
}