我在我的Android应用程序中使用Parse,并希望在查询运行以获取数据时使用对话框阻止UI。我首先创建并显示一个对话框,然后执行ParseQuery.find()。但是,对话框从不显示在UI上。我错过了什么吗?
//Show Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
builder.setTitle("Some Title...")
.setMessage("Please wait...")
.setCancelable(false);
dialog = builder.create();
dialog.show();
List<ParseObject> objects;
try {
objects = query.find();
//read is successful
if (objects != null && objects.size() > 0) {
...........
........
dialog.cancel();
......................
答案 0 :(得分:1)
是的,遗憾的是你遗失了一些东西。
我假设您在主线程上调用代码,首先是dialog.show()然后再执行query.find()。
你的问题是你(可能)在主线程上做了所有这些工作,并且在主线程有时间解析你的.show()命令之前,对话框才会显示。但是,由于您通过执行query.find()来阻止主线程,因此在代码执行完毕之前它不会显示。
您应该通过在后台线程上进行查询来解决此问题,例如:使用AsyncTask,Thread或其他一些方法。
让我告诉你如何使用线程。
public class MainActivity extends Activity {
AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Show Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
builder.setTitle("Some Title...").setMessage("Please wait...").setCancelable(false);
dialog = builder.create();
dialog.show();
new Thread() {
public void run() {
// Do you heavy lifting
List<ParseObject> objects;
try {
objects = query.find();
// read is successful
if (objects != null && objects.size() > 0) {
}
} catch (Exception e) {
}
// Since we are in a thread you need to post the cancel on the
// main thread, otherwise you'll be in trouble.
runOnUiThread(new Runnable() {
public void run() {
dialog.cancel();
}
});
}
}.start();
}
}
希望你能发现我的回答很有帮助!
最诚挚的问候, 埃里克