当用户在一个活动中单击按钮时,我需要处理一些数据,因此屏幕看起来像应用程序停止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 :(得分: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();
}
}
希望我有所帮助