繁体   English   中英

Android中AsyncTask中的ProgressDialog

[英]ProgressDialog in AsyncTask in android

我正在申请中的登录。 我正在尝试在我的BackgroundWorker类中显示progressDialog,以扩展Async任务。 但是,一旦我单击“登录”按钮,进度对话框就会显示几秒钟。 签名过程是否有可能持续更长的时间?

代码片段

`public class BackgrroundWorker extends AsyncTask<String,Void,String>{

    Context context;
    AlertDialog alertDialog;
    boolean correct;
    public BackgrroundWorker(Context context){
        this.context = context;
    }
    @Override
    protected String doInBackground(String... params) {
        String type = params[0];
        String login_url = "random";
        String register_url = "random";
        if(type.equals("login")){
            try {
                String username = params[1];
                String password = params[2];
                URL url = new URL(login_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("username","UTF-8") + "=" +URLEncoder.encode(username,"UTF-8")+ "&"
                    +URLEncoder.encode("password","UTF-8") + "=" +URLEncoder.encode(password,"UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result = "";
                String line = "";
                correct = false;
                while((line = bufferedReader.readLine()) != null){
                    result += line;
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                System.out.println(result);
                if (result.equalsIgnoreCase("login success"))
                    correct=true;
                return result;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(context, "Login",
                "Please wait for a while.", true);
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Login status");



    }

    @Override
    protected void onPostExecute(String result) {
        if(!result.equals("login success")) {
            alertDialog.setMessage(result);
            alertDialog.show();

        }
        progressDialog.dismiss();
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
}
`
progressDialog.dismiss();

该语句导致对话框消失,并且您在其中设置了没有任何条件的对话框

onPostExecute

如果要长时间显示对话框,请将其放在HandlerCountDownTimer中 您还可以使其成为用户交互的基础,例如单击按钮。 例如,如果要关闭对话框5秒钟,请执行以下操作:

@Override
protected void onPostExecute(String result) {
    if(!result.equals("login success")) {
        alertDialog.setMessage(result);
        alertDialog.show();

    }
    new CountDownTimer(5000, 1000) {

    public void onTick(long millisUntilFinished) {

    }

    public void onFinish() {
       progressDialog.dismiss();
   }
  }.start();

}

签名过程是否有可能持续更长的时间? (登录=登录)

肯定有。 想象一下设备正处于严重的节流状态,服务器需要花费一些时间来响应,或者停留在一个非常缓慢的网络上(例如:1g数据网络,或者我的本地星巴克wifi,同时供数百人使用)

您可以通过在android模拟器上加载您的应用程序并针对netspeednetdelay使用模拟器控制台命令来netspeed netdelay

基本步骤如下:

  • telnet localhost 5554
  • network speed 2 1

第一个数字(“ 2”)。 是上传速度(来自设备的流量),以千字节/秒为单位第二个数字(“ 1”),是下载速度(设备的流量),以千字节/秒为单位

  • network netdelay 10000

上面,我们设置了10秒的网络延迟/延迟

  • 然后在设备上执行登录

有关完成此操作的完整文档,请参见此处。 很多很棒的信息: https : //developer.android.com/studio/run/emulator-console.html

我还发现此答案很有帮助: https : //stackoverflow.com/a/6236379/794088

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM