在app查询服务器时需要显示加载屏幕

时间:2011-04-05 15:05:58

标签: android multithreading background android-asynctask

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

用户可能会等待几秒钟,具体取决于手机打开数据连接的速度(如果有的话)。在用户点击登录后,我需要对话框说“请等待”或“验证凭据”或其他内容。

所需的视觉顺序:按登录 - > “请等待”对话框显示在同一活动中 - >当结果从服务器进入时,会加载一个新活动(或抛出错误)

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

我正在尝试使用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);
    }

然后在我的oncreate方法中,我有了所有其他逻辑,比如用户点击按钮和东西,但我已经把它移到了AsyncTask方法的doInBackGround函数

  /* When the Login Button is clicked: */
        Button loginButton = (Button) findViewById(R.id.loginButton);
        loginButton.setOnClickListener(new OnClickListener() {            


            public void onClick(View v) {

                Progressor showMe = new Progressor();
                showMe.onPreExecute();
                showMe.doInBackground(null);
                showMe.onPostExecute();

和onPostExecute只是取消对话框

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您需要致电showMe.execute(),而不是直接致电doInBackgroundonPreExecute等。