我从外部服务器获取数据,并在android的listview中填充它。在异步任务期间,我在UI线程中显示"加载"对话框。UI还在后台显示了两个按钮。单击这些按钮后,ListAdapter被附加到listview并显示数据。但是由于后台线程仍然在运行,所以列表适配器是空的,不包含任何数据,所以点击这些按钮应用程序崩溃显示空指针例外。那么如何使后台UI(UI下的"加载对话框")无响应,而后台线程正在运行?还是有其他的解决办法?
如果你想在运行AsyncTask时停止与UI的所有交互,显示一个ProgressDialog并使其不可取消。比如:
public class MainActivity extends Activity {
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
}
class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog mProgress;
@Override
protected void onPreExecute() {
super.onPreExecute();
// Show ProgressDialog
mProgress = new ProgressDialog(mContext);
mProgress.setCancelable(false);
mProgress.setCanceledOnTouchOutside(false);
mProgress.setTitle("Fetching data");
mProgress.show();
}
...
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// Hide ProgressDialog when done loading
mProgress.dismiss();
}
}
}
这样,当doInBackground
运行时,您的UI将不可点击。
你肯定应该从开始的事件添加一个适配器到你的ListView,尽管它将是空的。
然后,当AsyncTask完成后,只需更新适配器的内容。