android中AsyncTask中的ProgressDialog

Posted

技术标签:

【中文标题】android中AsyncTask中的ProgressDialog【英文标题】:ProgressDialog in AsyncTask in android 【发布时间】:2018-01-28 13:47:33 【问题描述】:

我正在登录应用程序。我正在尝试在扩展异步任务的 BackgroundWorker 类中显示 progressDialog。但是只要我点击登录按钮,进度对话框就会显示几秒钟。签名过程是否有可能持续更长时间?

代码片段

`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);
    

`

【问题讨论】:

【参考方案1】:
progressDialog.dismiss();

此语句导致对话框消失,并且您在内部没有任何条件地设置它

onPostExecute

如果您想长时间显示对话框,请将其放在Handler 或CountDownTimer中。您还可以使其基于用户交互,例如按钮单击。 例如,如果你想关闭对话框 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();


【讨论】:

【参考方案2】:

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

确实有。想象一下设备被严重限制,服务器需要时间来响应,或者卡在一个非常慢的网络上(例如:1g 数据网络,或者我的本地星巴克 wifi,100 多个人同时使用)

您可以通过在 android 模拟器上加载您的应用程序并使用模拟器控制台命令 netspeednetdelay 来测试这一点

基本步骤如下:

telnet localhost 5554 network speed 2 1

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

network netdelay 10000

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

然后在设备上执行登录

完成此操作的完整文档在这里,我建议您查看它们。很多很棒的信息:https://developer.android.com/studio/run/emulator-console.html

我还发现这个答案很有帮助: https://***.com/a/6236379/794088

【讨论】:

以上是关于android中AsyncTask中的ProgressDialog的主要内容,如果未能解决你的问题,请参考以下文章

Android中的AsyncTask是如何执行的

OnCreate 中的 AsyncTask 在运行时失败,如何在 Android 中避免这种情况?

从Android中的AsyncTask返回一个值[重复]

就像 android 中的 AsyncTask 一样,iOS 中的等价物

从Android中的AsyncTask返回一个值[重复]

深入了解Android中的AsyncTask