6

抱歉,如果之前有人问过这个问题,但我找不到答案(我已经搜索过了!)

我试图按照 google/android 文档在我的应用程序执行冗长的任务时使不确定的进度条出现并旋转。

protected void readData(final String whatToFind) 
{

    try
    {
        if (whatToFind.length() == 0)
        {
            adapter.notifyDataSetChanged();
            return;
        }


        mProgress.setVisibility(View.VISIBLE);
        mProgressText.setVisibility(View.VISIBLE);

        m_dialog = new ProgressDialog(this);
            m_dialog.setTitle("Searching...");
            m_dialog.setMessage("Please wait while searching...");
            m_dialog.setIndeterminate(true);
            m_dialog.setCancelable(true); 
            m_dialog.show(); 

        new Thread(new Runnable() 
        {
            public void run() 
            {
                mHandler.post(new Runnable() 
                {    
                    public void run() 
                    {

                                while (LotsOfWorkGoingOn)  
                                {
                                    // Update the progress bar
                                        mHandler.post(new Runnable() {
                                         public void run() {
                                             mProgress.setProgress(m_i); /// vain attempt to make the progressbar spin
                                         }
                                     });                                

                                                         mProgress.setVisibility(View.GONE);
                                                         mProgressText.setVisibility(View.GONE);
                                                         m_dialog.hide();

                                            }

                        });
            }
        }).start();

    }
    catch (Exception ex)
    {
        Log.e(LOGid, "Error listing items:" + ex.getStackTrace());
    }
4

5 回答 5

9

setProgress仅在进度条不是 Indeterminate 时有效。

不确定意味着它没有进度量,当您不知道完成任务/剩余的进度量时使用它来结束任务。

文档中所述:

进度条也可以是不确定的。在不确定模式下,进度条会显示循环动画,但没有进度指示。当任务的长度未知时,应用程序使用此模式。不确定的进度条可以是旋转的轮子,也可以是水平条。

另一方面,如果您甚至没有看到进度条,也许您的背景是浅色的?

尝试将样式属性设置为:

style="@android:style/Widget.ProgressBar.Inverse"
于 2012-04-29T22:55:19.797 回答
8

也许我误解了这个问题,但对于那些试图让他们自定义的不确定ProgressBar旋转降落在这里的人,希望这可以帮助你。不要设置android:indeterminateDrawable为实际资产,而是设置为您自己的可旋转资产的自定义可绘制对象。

定义 res/drawable/progress_indeterminate_custom.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <rotate
      android:drawable="@drawable/your_custom_drawable"
      android:fillAfter="true"
      android:fromDegrees="0"
      android:pivotX="50%"
      android:pivotY="50%"
      android:toDegrees="360" />
  </item>
</layer-list>

当任务开始和结束时,您可以分别设置ProgressBartoVISIBLE和的可见性GONE

如果要修改旋转速度,此答案将更toDegrees改为 360 的倍数(即 720、1080 等)。

于 2015-04-20T20:16:51.007 回答
7

就我而言,我只是忘记了设备上的所有动画都已禁用。没有阻塞或任何不良控制设置。

于 2017-08-18T22:46:56.547 回答
5

假设存在 UI 阻塞问题,您可以通过AsyncTask以下方式扩展和使用它:

ProgressDialog m_dialog;

protected void readData(final String whatToFind) {

    if (whatToFind.length() == 0) {
        adapter.notifyDataSetChanged();
        return;
    }

    m_dialog = new ProgressDialog(this);
    new LengthyTask().execute();
}

//AsyncTask<Params, Progress, Result>
//Params: type passed in the execute() call, and received in the doInBackground method
//Progress: type of object passed in publishProgress calls
//Result: object type returned by the doInBackground method, and received by onPostExecute()
private class LengthyTask extends AsyncTask<Object, Integer, Object> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // initialize the dialog
        m_dialog.setTitle("Searching...");
        m_dialog.setMessage("Please wait while searching...");
        m_dialog.setIndeterminate(true);
        m_dialog.setCancelable(true);
        m_dialog.show();
    }

    @Override
    protected Object doInBackground(Object... params) {
        // do the hard work here
        // call publishProgress() to make any update in the UI
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // called from publishProgress(), you can update the UI here
        // for example, you can update the dialog progress
        // m_dialog.setProgress(values[0]); --> no apply here, because we made it indeterminate
    }

    @Override
    protected void onPostExecute(Object result) {
        super.onPostExecute(result);

        // close the dialog
        m_dialog.dismiss();
        //do any other UI related task
    }
}

有关 的更深入解释AsyncTask,请阅读此处此处

于 2012-04-30T23:58:49.077 回答
1

AsyncTask 应该可以解决问题,但我建议使用Android Annotations来使这种事情变得不那么冗长(并且更容易)。

void myMethod() {
    someBackgroundWork("hello", 42);
}

在后台发生的事情:

@Background
void someBackgroundWork(String aParam, long anotherParam) {
    [...]
    doInUiThread("hello", 42);
}

这可以调用在 UI 线程中发生的事情。

@UiThread
void doInUiThread(String aParam, long anotherParam) {
    [...]
}

Android Annotations 可能仅此一项就值得,但还有许多其他有用的 Annotations。

于 2013-12-30T00:26:26.397 回答