ProgressBar的可见性

时间:2013-09-25 12:32:39

标签: android android-progressbar

当用户在一个活动中单击按钮时,我需要处理一些数据,因此屏幕看起来像应用程序停止2-3秒。它并不是很多,但我想向用户提供一切正常的信息,IMO最好的方法是只有在处理数据时才能看到的进度条。

我找到了ProgressBar的代码,它看起来像这样:

    <ProgressBar
    android:id="@+id/loadingdata_progress"
    style="?android:attr/progressBarStyle"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignBottom="@+id/fin2_note"
    android:layout_centerHorizontal="true"
    android:indeterminate="true"
    android:visibility="invisible" />

并将其插入我的布局中间。

如果进度条有效,我会把这段代码

loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); loadingimage.setVisibility(View.VISIBLE);

进入onCreate方法,一切看起来都很好。 然后我重新创建代码以仅在处理数据时显示此进度条。

点击后,用户调用此方法

   public void fin2_clickOnFinalization(View v)
   {    

            loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress);
    loadingimage.setVisibility(View.VISIBLE);

          // code where data is processing
            loadingimage.setVisibility(View.INVISIBLE);
       }

屏幕上没有任何内容。我不知道哪里出错了。如果我通过id找到了进度条,对我来说很奇怪,我可以在onCreate方法中控制它,但是在onclick方法中它不受我的控制。

4 个答案:

答案 0 :(得分:8)

由于您的数据处理,您的UI线程无法显示进度条,因为它正忙。尝试使用这种代码:

public void fin2_clickOnFinalization(View v) {

    new YourAsyncTask().execute();
}

private class YourAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... args) {
        // code where data is processing
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {         
        loadingimage.setVisibility(View.INVISIBLE);
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        loadingimage.setVisibility(View.VISIBLE);
    }
}

修改

AsyncTask允许您在单独的线程中运行代码并使应用程序更具响应性,只需将耗时的代码放在doInBackground中。

答案 1 :(得分:4)

您没有给UI时间刷新。您的数据处理&#34;代码在UI线程上运行,阻止任何可见的更改。当系统获得控制以刷新显示时,您已经将其设置为不可见。

要解决此问题,请将处理代码移至单独的帖子或AsyncTask。然后,您可以将进度条设置为可见,启动任务,并在完成后将其自身隐藏。

我建议在Android上大约90%的时间用于此目的AsyncTask,因为它带有有用的回调。它的开发人员指南(在上面链接的Javadoc中)非常明确,并概述了您需要采取的所有步骤。

答案 2 :(得分:4)

AsyncTask对于此类任务的权重过高。

更好的解决方案

Handler handler = new Handler(getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        loadingimage.setVisibility(View.VISIBLE);
    }
});

甚至更简单(与上述解决方案基本相同)

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        loadingimage.setVisibility(View.VISIBLE);
    }
});

答案 3 :(得分:1)

您可以尝试创建一个不在布局中但在您的活动中的全局ProgressDialog,如:

public class MyActivity {

ProgressDialog progress = null;

protected void onCreate(...) {
    progressDialog = new ProgressDialog(this);
    progressDialog.setCancelable(false);
    progressDialog.setTitle("Progress");
}

public void fin2_clickOnFinalization(View v)
{    
    progress.show();
    // code where data is processing
    progress.dismiss();
}

}

希望我有所帮助