Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AlertDialog显示在方法insde线程完成Android Java之前_Java_Android_Multithreading_Android Studio - Fatal编程技术网

AlertDialog显示在方法insde线程完成Android Java之前

AlertDialog显示在方法insde线程完成Android Java之前,java,android,multithreading,android-studio,Java,Android,Multithreading,Android Studio,应用程序中的第一个活动检查在启动主活动之前是否正确加载了表和数据 若并没有,它将使用截击连接到服务器,加载数据和图像,然后要求用户重新启动应用程序 问题是:AlertDialog在方法完成加载之前显示为“message loading complete” 我在onCreate方法中创建了一个线程,并将所有方法放在其中,但同样的问题仍然存在 我的问题是:在方法完成数据加载后,如何显示alertDialog 这是我的密码: if(! (checkTables()&&check

应用程序中的第一个活动检查在启动主活动之前是否正确加载了表和数据

若并没有,它将使用截击连接到服务器,加载数据和图像,然后要求用户重新启动应用程序

问题是:
AlertDialog
在方法完成加载之前显示为“message loading complete”

我在
onCreate
方法中创建了一个线程,并将所有方法放在其中,但同样的问题仍然存在

我的问题是:在方法完成数据加载后,如何显示
alertDialog

这是我的密码:

    if(! (checkTables()&&checkData())){
        progressDialog.show();
        new Thread(new Runnable() {
            @Override
            public void run() {

                fillSamples();
                fillExams();
                fillQuestions();
                fillSubQuestions();
            }
        }).start();
        progressDialog.dismiss();
        AlertDialog.Builder builder=new AlertDialog.Builder(SplashScreen.this);
        builder.setMessage("Loading Data Complete Please restart your App");
        builder.setCancelable(false);
        builder.setPositiveButton("Restart", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                System.exit(1);
            }
        });
        AlertDialog dialog=builder.create();
        dialog.show();
    }

尝试使用AsyncTask而不是线程。更多信息

if(!(checkTables()&&checkData()){
GetData.execute();
}
类GetData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//添加进度对话框。
progressDialog.show();
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
AlertDialog.Builder=新建AlertDialog.Builder(SplashScreen.this);
setMessage(“加载数据完成,请重新启动应用程序”);
builder.setCancelable(false);
setPositiveButton(“重新启动”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
系统出口(1);
}
});
AlertDialog=builder.create();
dialog.show();
}
}
@凌驾
受保护的空位背景(空位…空位){
填充样本();
填写考试();
填写问题();
填充子问题();
返回null;
}
}

如果我使用处理程序,我必须以毫秒为单位确定时间,但加载时间不是固定的,这取决于internet速度,因此我无法为此使用处理程序。我已更新了答案。很遗憾,我的代码和你的代码正在运行,线程中的内容已完成,但问题是在方法之前显示警报对话框完成它们的工作在这种情况下,您需要使用线程的
isAlive()
,并为此编写一些侦听器。
if(! (checkTables()&&checkData())){
    GetData.execute();
}
class GetData extends AsyncTask<Void, Void,Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Add your progress dialog.
        progressDialog.show();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
            AlertDialog.Builder builder=new AlertDialog.Builder(SplashScreen.this);
            builder.setMessage("Loading Data Complete Please restart your App");
            builder.setCancelable(false);
            builder.setPositiveButton("Restart", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    System.exit(1);
                }
            });
            AlertDialog dialog=builder.create();
            dialog.show();
        }
    }

    @Override
    protected Void doInBackground(Void... voids) {
        fillSamples();
        fillExams();
        fillQuestions();
        fillSubQuestions();
        return null;

    }
}