2013-09-25 53 views
2

当用户点击一个活动中的按钮时,我需要处理一些数据,所以屏幕看起来像应用程序停止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方法中,它超出了我的控制范围。

+0

请粘贴您的完整的XML文件,其中进度编码 –

+0

我不t认为错误是在xml文件,因为当进度条被设置为onCreate中可见时,一切工作 – MyWay

回答

5

你的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

3

您没有给UI刷新时间。您的“数据处理”代码正在UI线程上运行,阻止任何可见的更改。在系统控制刷新显示时,您已经将其设置为隐形。

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

为了达到此目的,我推荐在Android上使用AsyncTask,因为它带有有用的回调函数。开发人员指南(在上面链接的Javadoc中)非常明确,并概述了您需要采取的所有步骤。

+0

thx这篇文章,我寻找链接,它可以帮助我创建我自己的类; – MyWay

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(); 
} 

} 

希望我可以帮助

+0

如果用户关数据处理过程中的活动?我认为创建和解散对话框应该在检查活动是否在前台之后完成,否则如果活动不存在则它将通过IllegalArgumentException或BadTokenException – rd7773

1

对于这样的任务,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); 
    } 
});