图1:
图2:
图3:
activity_main.xml
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="圆形进度条对话框"
android:onClick="showPD"
android:layout_gravity="center"
android:layout_marginTop="80dp" />
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showPD(View v){
final ProgressDialog dialog = ProgressDialog.show(this,"数据加载","数据加载中...");
// 模拟做一个长时间的工作
// 长时间的工作不能在主线程做,得启动 子线程 完成
new Thread(){
@Override
public void run() {
for (int i=0;i<20;i++){
// 休息一会
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 移除 dialog
dialog.dismiss(); //虽然是在子线程中执行的,但是内部使用Handler实现主线程更新UI
// 不能再子线程直接更新UI, Toast
// 将 子线程 切换 主线程 去更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"加载完成了!!!",Toast.LENGTH_LONG).show();
}
});
}
}.start();
// 注意Toast不能放在这个位置进行提示,因为多线程的意思就是在不断往下执行代码的过程中,也不断的在做线程中的逻辑问题,那么如果这样么写
// 就会造成 Toast 直接提示了,应该要放在子线程执行完后,再去执行
// Toast.makeText(MainActivity.this,"加载完成了!!!",Toast.LENGTH_LONG).show();
}
}
总结:
1. 子线程不能更新UI界面
2. 启动子线程代码:
new Thread(){
@Override
public void run() {
}
}.start();
3. 在子线程中切换回主线程代码:
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
4. 要注意线程的执行和方法的顺序向下执行代码块是同时进行的!