一、两个方法的区别:
1、执行execute()方法线程可以只能串行运行
2、执行executeOnExecuter()方法线程并行运行,不过同一时间只能启动五个线程
二、我做了一个小小的实例,表现他们的区别
1、创建四个progressbar和四个按钮,注意绑定id
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.myapplication.ProgressBarActivity">
<ProgressBar
android:id="@+id/progress_bar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progress_bar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/download_btn1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="下载一" />
<Button
android:id="@+id/download_btn2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="下载二" />
<ProgressBar
android:id="@+id/progress_bar3"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progress_bar4"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/download_btn3"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="下载三" />
<Button
android:id="@+id/download_btn4"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="下载四" />
</LinearLayout>
2、对布局中的控件进行创建,绑定id,监听,使用AsyncTask实现异步消息的传递前两个进度条使用execute()方法启动,后两个进度条使用executeOnexecuter()方法启动
public class ProgressBarActivity extends AppCompatActivity implements View.OnClickListener {
private ProgressBar bar1;
private ProgressBar bar2;
private ProgressBar bar3;
private ProgressBar bar4;
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar);
bangID();
}
private void bangID() {
bar1 = findViewById(R.id.progress_bar1);
bar2 = findViewById(R.id.progress_bar2);
bar3 = findViewById(R.id.progress_bar3);
bar4 = findViewById(R.id.progress_bar4);
bar1.setMax(10);
bar2.setMax(10);
bar3.setMax(10);
bar4.setMax(10);
btn1 = findViewById(R.id.download_btn1);
btn2 = findViewById(R.id.download_btn2);
btn3 = findViewById(R.id.download_btn3);
btn4 = findViewById(R.id.download_btn4);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.download_btn1:
new MyasyncTask().execute(1);
break;
case R.id.download_btn2:
new MyasyncTask().execute(2);
break;
case R.id.download_btn3:
new MyasyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,3);
break;
case R.id.download_btn4:
new MyasyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,4);
break;
default:
break;
}
}
class MyasyncTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Integer... integers) {
for (int i = 0; i <= 10; i++) {
switch (integers[0]) {
case 1:
bar1.setProgress(i);
break;
case 2:
bar2.setProgress(i);
break;
case 3:
bar3.setProgress(i);
break;
case 4:
bar4.setProgress(i);
break;
default:
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return integers[0];
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer){
case 1:
btn1.setText("一下载完成");
break;
case 2:
btn2.setText("二下载完成");
break;
case 3:
btn3.setText("三下载完成");
break;
case 4:
btn4.setText("四下载完成");
break;
default:
break;
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}
}
效果展现:
1)可以看到使用execute()方法启动的进度条一个结束后才能启动另一个进度条
2)使用executeOnexecuter()启动的进度条同时下载