【问题标题】:Async task to show an AlertDialog显示 AlertDialog 的异步任务
【发布时间】:2011-06-27 13:57:49
【问题描述】:

在过去的几天里,我无法解决我的对话框的问题。我正在运行一个线程来显示 5000 毫秒的对话框并将其删除。我正在尝试举杯(“SUCCESS”)。问题是我也第二次得到这个对话框。我是 android 开发的新手,我需要用 Async Task 解决这个问题,这样我就可以延迟第二个线程并显示一个带有肯定按钮而不是 toast 的警报 dialog.builder。我看了很多,但我很困惑实现这个

在这里,我将我的凭据发送到服务器,并且在发送时我显示了一个 5000 毫秒的进度对话框,我希望有一个单独的线程来显示带有肯定按钮的 dialog.builder。(当用户得到一个在 logcat 中的响应,我应该从 logcat 中检查 responsecode==1 以显示构建器)

如果可能的话,请有人帮我用一些代码 sn-p 来解决这个问题。

提前致谢。

这是我需要实现异步任务的代码

Button signin = (Button) findViewById(R.id.regsubmitbtn);
    signin.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // showDialog(0);
            t = new Thread() {
                public void run() {
                    register();
                    try {
                        while (counter < 2) {
                            showmsg(0);
                            Thread.sleep(5000);
                            removeDialog(0);
                            // Toast.makeText(Register.this, "Registerd", Toast.LENGTH_LONG).show();
                            showmsg(1);
                            // toast.show();

                            Thread.sleep(1000);

                        }

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            t.start();
        }
    });

}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case 0: {
        ++counter;
        dialog = new ProgressDialog(this);
        if (counter == 1) {
            dialog.setMessage("Registering...");
        }
        else {
            String resultsRequestSOAP = "";
            if (Log.v("TAG", String.valueOf(resultsRequestSOAP)) == 1)
                ;
            {
                Context context = getApplicationContext();
                CharSequence text = "Registerd";
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }
        }
        dialog.setIndeterminate(true);
        dialog.setCancelable(true);
        return dialog;
    }
    }
    return null;
}

public void showmsg(int actionsToBePerformedOnScreen) {
    Message msg = new Message();
    msg.what = actionsToBePerformedOnScreen;
    handler.sendMessage(msg);

}

public Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 0:

            showDialog(0);

            break;

        case 1:
            // clear all images in the list
            removeDialog(0);
            break;

        }

    };
};

【问题讨论】:

    标签: android android-asynctask builder


    【解决方案1】:

    简单:在doInBackground 中显示对话框onPreExecute,在doInBackground 中注册()并在onPostExecute 中隐藏对话框。最后,在您的onclick 中执行new RegisterTask().execute()

     private class RegisterTask extends AsyncTask<Void, Void, Boolean> {
      private final ProgressDialog dialog = new ProgressDialog(YourClass.this);
    
      protected void onPreExecute() {
         this.dialog.setMessage("Signing in...");
         this.dialog.show();
      }
    
      protected Boolean doInBackground(final Void unused) {
         return Main.this.register(); //don't interact with the ui!
      }
    
      protected void onPostExecute(final Boolean result) {
         if (this.dialog.isShowing()) {
            this.dialog.dismiss();
         }
         if (result.booleanValue()) {
         //also show register success dialog
         }
      }
    }
    

    【讨论】:

    • 非常感谢您的回复。你能告诉我 return Main.this.register();
    • 好吧,你没有发布方法的声明,所以我只是假设register() 是你的 Activity 中的一个方法(我标记为“Main”只是为了给它一个名字)。所以RaghuActivity.this.register() 就是我的意思。
    • 他不是特意询问了 AlertDialog 吗?
    【解决方案2】:

    你为什么不用安卓AsyncTask? 例如:

    public class MyPreloader extends AsyncTask<InputObject, Void, OutputObject>{
    private Context context;
    private ProgressDialog dialog;
    
    public MyPreloader(Context context){
        this.context = context;
    }
    
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(context);
        dialog.setMessage("Please wait...");
        dialog.setIndeterminate(true);
        dialog.show();
        super.onPreExecute();
    }   
    
    @Override
    protected ResponseBase doInBackground(InputObject... params) {
    InputObject input = params[0]; 
    //some code for background work
        }
    
    @Override
    protected void onPostExecute(OutputObject result) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
        super.onPostExecute(result);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多