有几天有一些问题。
我需要在主线程中做一些东西时显示简单的ProgressBar
(不是对话框)...
我认为这是一个非常简单的问题,但我不能这样做,请帮助我。
首先我尝试过简单setVisibility(View.VISIBLE)
之前和setVisibility(View.GONE)
之后。
但这是在同一个线程中进行的,ProgressBar
在我的函数工作时冻结。
现在我有这个代码,但我有一些错误,我不知道什么是错的..
我的简单布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
</FrameLayout>
我有一个基础活动:
public class BaseActivity extends Activity {
public ProgressBar loading;
public class ProgressBarShow extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... unused) {
return(null);
}
protected void onProgressUpdate() {
}
protected void onPreExecute() {
loading.setVisibility(View.VISIBLE);
}
protected void onPostExecute() {
}
}
}
最后是我的工作活动,扩展了BaseActivity
public class SearchActivity extends BaseActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loading = (ProgressBar) findViewById(R.id.loading);
new ProgressBarShow().execute();
//doing long stuff
//new ProgressBarHide().execute(); there isnt, but sense the same
}
}
我有很多活动需要进度条,这就是我创建BaseActivity
的原因,
不要公开代码。
我需要在主线程中做长时间的工作(东西功能),因为我想冻结主窗口而不允许用户做任何事情(点击按钮等),只显示工作进度条。
我的例子有什么不对?或者给我一些建议我怎样才能做得更好
答案 0 :(得分:2)
class ProgressTask extends AsyncTask<Integer, Integer, Void>{
ProgressBar progress;
Context context;
public ProgressTask(ProgressBar progress, Context context) {
this.progress = progress;
this.context = context;
}
@Override
protected void onPreExecute() {
// initialize the progress bar
// set maximum progress to 100.
progress.setMax(100);
}
@Override
protected Void doInBackground(Integer... params) {
// get the initial starting value
int start=params[0];
// increment the progress
for(int i=start;i<=100;i+=5){
try {
boolean cancelled=isCancelled();
//if async task is not cancelled, update the progress
if(!cancelled){
publishProgress(i);
SystemClock.sleep(1000);
}
} catch (Exception e) {
Log.e("Error", e.toString());
}
}
return null;
}
//Has direct connection to UI Main thread
//Called everytime publishProgress(int) is called in doInBackground
@Override
protected void onProgressUpdate(Integer... values) {
progress.setProgress(values[0]);
Toast.makeText(context, "test"+values[0], Toast.LENGTH_SHORT).show();
}
@Override
protected void onPostExecute(Void result) {
// async task finished
Log.v("Progress", "Finished");
}
@Override
protected void onCancelled() {
progress.setMax(0);
}
}
答案 1 :(得分:0)
使用AsyncTask http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html将ProgressBar放入其中,而所有工作都在主线程中进行