为什么在Parse Query.find之前调用时,不会在UI上显示Android Dialog

时间:2014-05-13 16:39:07

标签: android parse-platform alertdialog

我在我的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();
    ......................

1 个答案:

答案 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();
    }
}

希望你能发现我的回答很有帮助!

最诚挚的问候, 埃里克