3

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

4

4 回答 4

0

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

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);
  }
}
于 2012-09-13T09:12:20.857 回答
0

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

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);
        }
    }
}
于 2017-12-11T12:37:19.577 回答
0

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

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();
    }
}
于 2020-04-29T07:42:13.457 回答
-1

这可能会帮助你

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();
于 2012-09-13T11:30:53.597 回答