我有一个课程,我必须执行3个长操作。并且必须以25%,50%,75%和100%的间隔显示进度条。
由于操作使用UI线程,我无法将它们放在DoinBackground方法()中。
我将opeartions放在progressUpdate方法
中代码
package com.integrated.mpr;
import org.apache.commons.math.linear.RealMatrix;
import org.apache.commons.math.stat.correlation.Covariance;
import org.apache.commons.math.stat.correlation.PearsonsCorrelation;
import org.apache.commons.math.util.FastMath;
public class Logic extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.progress);
String x = "abc";
new loadSomeStuff().execute(x);
}
public class loadSomeStuff extends AsyncTask<String,Integer,String>{
ProgressDialog dialog;
protected void onPreExecute(){
dialog = new ProgressDialog(Logic.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
publishProgress(25);
publishProgress(50);
publishProgress(75);
publishProgress(100);
return null;
}
protected void onProgressUpdate(Integer...progress){
if(progress[0]==25){
dialog.incrementProgressBy(25);
Log.d("now in ", "25 loop");
// do some long work in loop1
dialog.incrementProgressBy(25);
}
else if(progress[0]==25){
dialog.incrementProgressBy(25);
Log.d("now in ", "50 loop");
// do some long work in loop2
dialog.incrementProgressBy(25);
}
else if (progress[0] == 75){
dialog.incrementProgressBy(25);
// do some long work in loop3
}
else{
dialog.incrementProgressBy(25);
}
}
protected void onPostExecute(String result){
dialog.dismiss();
Intent openList = new Intent("com.integrated.mpr.SENSITIVELIST");
startActivity(openList);
}
}
}
现在,当我运行时,会出现一个空白屏幕,并且进度仅显示100%。 我怎么能纠正这个?请帮忙
答案 0 :(得分:0)
首先,你犯了一些大错误。
onProgressUpdate用于更新UI,因此您无需对该方法进行长时间的工作。您必须在doInBackground中完成所有长期工作,当您完成其中的一部分时,您可以调用onProgressUpdate来更新UI。
另外
现在,当我运行时,会出现一个空白屏幕,并显示进度 仅显示100%
那是因为你没有工作而你的手机很快:P 每次调用onProgressUpdate时尝试放置一个Thread.sleep(1000):)
你将用真实的工作取代睡眠!
答案 1 :(得分:-1)
您不应该使用ui线程来计算长操作。你的长操作应该在doinbackground中执行,它将在不同的线程中执行它们。
编辑:我认为问题在于你真的想用你的ui线程工作。如果是这种情况,也许处理程序会更合适。
http://developer.android.com/reference/android/os/Handler.html