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