在此应用程序中,用户登录并根据服务器检查其凭据。
用户可能会等待几秒钟,具体取决于手机打开数据连接的速度(如果有的话)。在用户点击登录后,我需要对话框说“请等待”或“验证凭据”或其他内容。
所需的视觉顺序:按登录 - > “请等待”对话框显示在同一活动中 - >当结果从服务器进入时,会加载一个新活动(或抛出错误)
当前视觉顺序:按登录 - >用户等待应用程序被冻结 - >新活动已加载
我正在尝试使用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) {
答案 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()
,而不是直接致电doInBackground
或onPreExecute
等。