我正在编写一个应用程序,并且有一个自定义 View 。在此自定义 View 中,我必须计算不确定数量的点的位置。点数取决于我从数据库中读取的内容(因此每个用户的情况有所不同)。
所以,我的问题是,我怎样才能很好地解决这个问题?该应用程序的步骤如下:
问题是,当我打开 Activity 时,会调用
onDraw()
-method,但是我无法绘制任何内容,因为我必须等待数据库查询和积分计算。在计算完成之前,如何使用线程以及进度条之类的东西? Activity 开始后,我可以阻止该应用立即运行onDraw()
-method吗?我感谢您的帮助。
edit1:代码如下(注意:我现在不想计算任何东西,出现错误是因为我试图将ProgressBar的可见性设置为true,但如果没有这行就行了):
public class MyView extends View {
private ProgressBar progressBar;
private boolean calculationsDone;
public MyView(Context context, AttributeSet attrs) {
super(context);
// TODO Auto-generated constructor stub
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
calculationsDone=false;
}
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
if(calculationsDone == true){
//draw stuff
progressBar.setVisibility(INVISIBLE);
}else{
Log.d("calcNotDone", "CALCULATION NOT DONE YET!");
progressBar.setVisibility(VISIBLE);
}
}
}
错误如下:
最佳答案
您应该对onDraw()
生命周期进行一些研究。onDraw
在开始时被调用,然后在每次绘制“东西”时再次调用invalidate
。您如何告诉 View 有“东西”要绘制?通过调用“onDraw
”。
因此,如果未加载点,则首先在invalidate()
上不执行任何操作。
完成计算后,只需调用onDraw
,以后就会异步调用OnDraw
。到这时,在AsyncTask
中,您将检测到计算已准备就绪,因此然后就是您绘制内容的时候。
有点儿:
boolean myCalculationsAreReady=false;
Paint mPaint=new Paint(); // to draw text "loading" ... (new edit). You have to call mPaint.setColor(Color.WHITE) or any color you want, the default would be Black.
public void onDraw(Canvas canvas) {
if (myCalculationsAreReady) {
drawMyStuff (canvas);
} else {
// You don't have your calculations yet , just ignore, or paint a message ...
drawDataNotReady(canvas);
}
}
private void drawMyStuff (Canvas c) {
// here you have your calculations available
// time to draw !
}
// to make this view totally independent, you can create yourself a progress indicator here.
// you can also put a standard progressbar at the parent level and notify the parent when
// to show / hide it. I like this approach, because it's more efficient (you save one view)
// but obviously you can use any fancy view you like over this one.
private void drawDataNotReady (Canvas c) {
c.drawText (0, c.getHeight() / 2, "Please wait while data is loading ...", mPaint);
}
private void do_my_heavy_calculations () {
// do all your calculations.
.
.
.
// when you are done:
myCalculationsAreReady=true;
invalidate(); // this will call onDraw
}
当您了解这是如何工作的,并且如果您的计算量很大时,您肯定希望将其从UI线程中删除。您可以像询问一样使用普通线程,但是,调用“无效”的方式有所不同:
view.postInvalidate();
这用于使来自主UI线程(即您的线程)外部的 View 无效。
还要将ojit_code作为一个类 checkout ,以帮助编写异步线程。
关于android - 在onDraw()中使用线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22765947/