你应该借助
AsyncTask(一个智能后台线程)和
ProgressDialog来完成这个任务,具体请参考
文档的说明:
AsyncTask 可以正确且轻松地使用 UI 线程。这个类允许在后台执行操作并在 UI 线程上发布结果,而无需操纵线程和/或处理程序。
异步任务由在后台线程上运行的计算和其结果在 UI 线程上发布的方式定义。异步任务由 3 种通用类型 Params、Progress 和 Result 和 4 个步骤 begin、doInBackground、processProgress 和 end 定义。
4 个步骤
当执行异步任务时,任务经过 4 个步骤:
onPreExecute()
:在任务执行后立即在 UI 线程上调用。此步骤通常用于设置任务,例如在用户界面中显示进度条。
doInBackground(Params...)
:在 onPreExecute() 完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数传递到此步骤。计算的结果必须由此步骤返回,并将传递回最后一步。此步骤还可以使用 publishProgress(Progress...) 发布一个或多个进度单元。这些值在 onProgressUpdate(Progress...) 步骤中在 UI 线程上发布。
onProgressUpdate(Progress...)
:在调用 publishProgress(Progress...) 后在 UI 线程上调用。执行的时间未定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用于动画化进度条或在文本字段中显示日志。
onPostExecute(Result)
:在后台计算完成后在 UI 线程上调用。将后台计算的结果作为参数传递给此步骤。线程规则
必须遵循一些线程规则才能使此类正常工作:
任务实例必须在 UI 线程上创建。execute(Params...) 必须在 UI 线程上调用。不要手动调用 onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...)。任务只能执行一次(如果尝试进行第二次执行,则会抛出异常)。
示例代码 在这个示例中适配器的作用并不重要,更重要的是要理解你需要使用AsyncTask来显示进度对话框。
private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(viewContacts.this);
dialog.setMessage(getString(R.string.please_wait_while_loading));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected ContactsListCursorAdapter doInBackground(Void... params) {
cur1 = objItem.getContacts();
startManagingCursor(cur1);
adapter1 = new ContactsListCursorAdapter (viewContacts.this,
R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {});
return adapter1;
}
protected void onPostExecute(ContactsListCursorAdapter result) {
list.setAdapter(result);
dialog.dismiss();
}
}