最近开始做安卓项目,然而对多线程的理解和应用还是欠缺,最近就系统的学习一下
public class TestThreadActivity extends BaseActivity {
private ProgressBar progressBar;
private TextView textView;
private Button downloadBtn;
private MyTask task;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thread_activity);
initViews();
testDatass();
}
private void initViews(){
progressBar = findViewById(R.id.progress_v);
progressBar.setMax(100);
progressBar.setProgress(0);
textView = findViewById(R.id.text_v);
textView.setText("0");
downloadBtn = findViewById(R.id.btn_start_download);
task = new MyTask();
downloadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
task.execute();
}
});
}
//下载的一个小demo
private class MyTask extends AsyncTask{
private int count = 0;
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("0");
}
@Override
protected Object doInBackground(Object[] objects) {
count = 0;
while (count <100){
try{
Thread.sleep(1*1000);
count += 1;
}catch (Exception e){
e.printStackTrace();
}
publishProgress(count);
}
return null;
}
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
progressBar.setProgress((Integer) values[0]);
textView.setText("loading ..."+values[0] +"%");
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
textView.setText("加载完成");
}
@Override
protected void onCancelled() {
super.onCancelled();
textView.setText("已取消");
progressBar.setProgress(0);
}
}
private void testDatass(){
new MythreadE().start();
new Thread(new MyRunable()).start();
}
//继承Thread方式生成新的子线程
private class MythreadE extends Thread{
@Override
public void run() {
Log.d("BOB"," MythreadE extends Thread");
}
}
//实现Runable借口的子线程
private class MyRunable implements Runnable{
@Override
public void run() {
Log.d("BOB"," MyRunable implements Runnable");
}
}
private void test1(){
new Thread(new Runnable() {
@Override
public void run() {
try{
//耗时操作
Thread.sleep(10 * 1000);
}catch (Exception e){e.printStackTrace();}
//切换到主线程操作
runOnUiThread(new Runnable() {
@Override
public void run() {
//更新UI
}
});
}
}).start();
final Button btn1 = findViewById(R.id.btn_test1);
new Thread(new Runnable() {
@Override
public void run() {
//主线程更新UI
btn1.post(new Runnable() {
@Override
public void run() {
btn1.setText("china1");
}
});
//主线程更新UI,带延时
btn1.postDelayed(new Runnable() {
@Override
public void run() {
btn1.setText("china2");
}
}, 1 * 1000);
}
}).start();
}
//Handler(子线程调用Handler的
//handle.sendMessage(msg);
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//更新UI操作
}
};
private class MyHThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(10*1000);
}catch (Exception e){
e.printStackTrace();
}
Message msg = new Message();
handler.sendMessage(msg);
super.run();
}
}
private void testAsyTask(){
asyTask asytask = new asyTask();
/*
* 步骤3:手动调用execute(Params... params) 从而执行异步线程任务
* 注:
* a. 必须在UI线程中调用
* b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
* c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()
* d. 不能手动调用上述方法
*/
asytask.execute();
}
// 轻量级异步类
private class asyTask extends AsyncTask{
// private boolean loadWastTimeWork(){
// boolean isOk =
// try{
// Thread.sleep(5*100);}catch (Exception e){e.printStackTrace();}
// }
//执行任务前操作
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//后台线程执行时,可以在执行过程中调用publishProgress() 更新进度信息
@Override
protected Object doInBackground(Object[] objects) {
//publishProgress();
return null;
}
//上面的 publishProgress() 调用之后,自动调用
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
}
//后台线程执行结束后的操作,其中参数result为doInBackground返回的结果
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
//ui更新操作
}
//异步任务被取消时候自动调用
@Override
protected void onCancelled() {
super.onCancelled();
}
}
}