Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Android 应用程序查询服务器时需要显示加载屏幕_Android_Multithreading_Background_Android Asynctask - Fatal编程技术网

Android 应用程序查询服务器时需要显示加载屏幕

Android 应用程序查询服务器时需要显示加载屏幕,android,multithreading,background,android-asynctask,Android,Multithreading,Background,Android Asynctask,在此应用程序中,用户登录并根据服务器检查其凭据 用户可能会等待几秒钟,这取决于手机打开数据连接的速度(如果有的话)。我需要一个对话框,上面写着“请稍候”或“验证凭据”,或者在用户单击“登录”后出现一长串的内容 所需的视觉顺序:按登录->在同一活动中显示“请等待”对话框->当结果来自服务器时,将加载新活动(或引发错误) 当前可视顺序:按登录->用户等待,如同应用程序已冻结->加载新活动 我正试图用AsyncTask做这个线程化的事情,但我现在还没有得到它 class Progressor exte

在此应用程序中,用户登录并根据服务器检查其凭据

用户可能会等待几秒钟,这取决于手机打开数据连接的速度(如果有的话)。我需要一个对话框,上面写着“请稍候”或“验证凭据”,或者在用户单击“登录”后出现一长串的内容

所需的视觉顺序:按登录->在同一活动中显示“请等待”对话框->当结果来自服务器时,将加载新活动(或引发错误)

当前可视顺序:按登录->用户等待,如同应用程序已冻结->加载新活动

我正试图用AsyncTask做这个线程化的事情,但我现在还没有得到它

class Progressor extends AsyncTask<Void, Void, Void> {

ProgressDialog dialog;
    protected void onPreExecute(){
        dialog = ProgressDialog.show(Login.this, "Logging In", 
                "Verifying Credentials, Please wait...", true);
    }
onPostExecute只会关闭对话框

为什么这不起作用,应该如何重新安排。我应该向showMe.doInBackGround()函数传递什么变量,它是void。在调试中,它永远不会进入这里

    @Override
    protected Void doInBackground(Void... arg0) {

我在应用程序开始时有一个类似的代码,我从服务器加载当前设置,它适用于我:

public static ProgressDialog verlauf;
public static String vmessage = "";
static Handler handler = new Handler();;

public static void initialize_system(final Context ctx)
    {
        verlauf = ProgressDialog.show(ctx, "Starte FISforAndroid..", "synchronisiere Einstellungen",true,false);
        new Thread(){
             @Override
            public void run(){
                Looper.prepare();
                GlobalVars.table_def.initialize();
                vmessage = "erstelle Tabellen";
                handler.post(verlauf_message);
                builded = sqldriver.create_tables();
                vmessage = "setze Systemkonstanten";
                handler.post(verlauf_message);
                builded = setsystemvars(ctx);
                vmessage = "synchronisiere Einstellungen";
                handler.post(verlauf_message);
                builded = settings.sync_ini();
                builded = settings.set_ini();
                GlobalVars.system_initialized = builded;
                 switch(GlobalVars.init_flags.FLAG){
                    case 0:

                        break;
                    case GlobalVars.init_flags.UPDATE: 
                        //load the update
                        break;
                 }
                verlauf.dismiss();  
             }
        }.start();
    }

不要手动调用异步任务的
onPreExecute
/
doInBackground
方法;只要对它调用
execute()
,它就会从正确的线程在正确的位置调用所有方法。从UI线程同步调用异步任务的所有方法(您的示例代码就是这样做的)违背了异步任务的全部目的。

这不是使用
异步任务的方式,请查看。创建任务的新实例后,只需调用
execute()
,而不是单个方法:

Progressor showMe = new Progressor();
showMe.execute();

你需要调用
showMe.execute()
,而不是直接调用
doInBackground
onPreExecute
等。谢谢,这个澄清真的帮了我的忙!
Progressor showMe = new Progressor();
showMe.execute();