场景是从网络中拉取数据并渲染到UI中。
ProgressDialog用来告知用户“正在加载”。如果加载太慢,可能导致用户不想等待,用户选择退出(按返回键
)时应该是ProgressDialog和对应的下面的Activity都退出。
而ProgressDialog本质上是一个新的Activity。所以要做到ProgressDialog和Activity都退出
稍微麻烦。
代码:
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler(Looper.getMainLooper());
ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialog = ProgressDialog.show(MainActivity.this, "",
"数据加载中", true, true);
dialog.setCanceledOnTouchOutside(false);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
MainActivity.this.finish();
}
});
// 从网络拉取数据,并渲染到UI中
getDataAndRender();
}
private void getDataAndRender() {
new Thread() {
@Override
public void run() {
super.run();
// 从网络获取数据
Thread.sleep(1*1000); // 防止dialog一闪而过
dialog.dismiss();
mHandler.post(new Runnable() {
@Override
public void run() {
// 渲染UI
}
}
}
}.start();
}
}
ProgressDialog的dismiss方法是让dialog消失,但不会触发setOnCancelListener里设置的事件响应函数。cancel不仅让dialog消失,而且会触发setOnCancelListener里设置的事件响应函数。
ProgressDialog.show(MainActivity.this, "", "数据记载中", true, true);
最后一个参数是true,这样dialog监听用户的返回操作然后触发cancel。