繁体   English   中英

如何以最短加载时间(2 秒)在 AsyncTask 中添加进度对话框

How can I add a progress dialog in AsyncTask with minimum loading time (2sec)

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

当用户单击按钮时,将从活动 A 转到活动 B。
但是,由于在 Activity B 中,数据将从 Internet 下载,因此我想添加一个进度对话框。 有时,连接会非常快,不到一秒,有时会超过 5 秒。
如果进度对话框显示 <1 秒,我认为这对用户体验非常不利。
所以,我想添加一个最小加载时间,例如 2 秒。
这意味着即使加载时间少于 2 秒,进度对话框也会至少显示 2 秒。
有没有办法做到这一点?

4 个回复

您可以使用下面的代码。 在此处传递对话框的时间和对象。

public void timerDelayRemoveDialog(long time, final Dialog d){
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {                
            d.dismiss();         
        }
    }, time); 
}

已编辑

您可以使用此示例代码:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}

我的解决方案(效果很好):

private class ProgressTask extends AsyncTask<Void, Void, Void> {
    ProgressDialog dialog;
    long timestamp1;
    long timestamp2;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(YOUR_CONTEXT);
        dialog.setCancelable(false);
        dialog.setMessage("Please wait...");
        dialog.show();

        timestamp1 = System.currentTimeMillis();
    }

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

        //doSomething ...

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        //doSomething ...

        timestamp2 = System.currentTimeMillis();
        long timeDifference = timestamp2 - timestamp1;

        if (timeDifference >= 2000) {
            dialog.dismiss();
        } else {
            Handler h = new Handler();
            h.postDelayed(new Runnable() {
                public void run() {
                    dialog.dismiss();
                }
            }, 2000 - timeDifference);
        }
    }
}

这是另一个版本。 使用 SystemClock 不需要 try catch 块。 ParentActivity.this是执行 Task 的上下文。

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.SystemClock;

protected class Task extends AsyncTask< String, Void, String >
{
    private ProgressDialog mDialog = new ProgressDialog( ParentActivity.this );

    private long mTaskStartTimeMills;

    protected void onPreExecute()
    {
        mTaskStartTimeMills = System.currentTimeMillis();

        mDialog.setMessage( "Loading.." );
        mDialog.show();
    }

    protected String doInBackground( String... arg )
    {
        // TODO
        return null;
    }

    protected void onPostExecute( String json )
    {
        final long timeToWait = 1000 - ( System.currentTimeMillis() - mTaskStartTimeMills );

        if ( timeToWait > 0 )
        {
            SystemClock.sleep( timeToWait );
        }

        mDialog.dismiss();
    }
}

这可能会帮助你

new AsyncTask<Void, Void, Void>() {
            ProgressDialog mDialog;
            ArrayList<String> files;            
            @Override
            protected void onPreExecute() {
                mDialog = new ProgressDialog(MyMainAct.this);
                mDialog.setMessage("Loading");
                mDialog.show();
            }
            @Override
            protected Void doInBackground(Void... params) {
                // TODO Auto-generated method stub
                          //   do your work here 
                Log.i("Share Media MyMainAct", " newFiles is called path is - " + path +"/" + spndirectory.getSelectedItem().toString());               
                files = getFiles(path + "/" + spndirectory.getSelectedItem().toString());               
                return null;
            }           
            @Override
            protected void onPostExecute(Void result){              
                if (mDialog != null && mDialog.isShowing()){
                    mDialog.dismiss();
                }
                setFileAdapter(files);
            }
        }.execute();
2 如何使用asynctask在按钮中添加进度对话框

我尝试这个教程 我仍然困惑如何使用asynctask在按钮注销中添加进度对话框 这是我的活动。 因此,当我单击按钮注销时,进度对话框将显示并有一个时间,例如5秒。 怎么做? 按钮注销EDIT: 这是logoutUser函数 编辑:这是asynctask ...

2013-02-07 18:44:25 1 607   android
4 swiftUI 如何禁用按钮 2 秒?

我有一个错误,如果我在卡片翻转之前在动画之前单击按钮。 我认为对我来说最好的方法是禁用按钮 2 秒,但我做了一些研究并没有找到任何东西! ...

5 如何长时间将光传感器值存储在数组中? 1个样本/ 2秒

我正在为个人项目开发应用程序,稍后需要在Matlab上处理数据(用于电源要求)。 因此,我的目标是每两秒以阵列形式“存储”光传感器的值。 现在,我能够根据智能手机的默认频率实时正确显示传感器的值,并显示在屏幕上! 我是Android的新手,每天都在学习哈哈! 我只是停留在那里...最终目 ...

8 如何在AsyncTask中设置进度对话框

嗨,我对ProgressDailog有一个问题。 我无法在我的代码中正确设置它。 在我的代码中,我通过JSON数组获取图像的URL,然后将这些图像下载到GridView ,然后单击以在下一个活动中单击以显示选定的图像。这些都可以正常工作,但是问题是因为我在我的AsyncTask中使用代码在后 ...

暂无
暂无

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

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