我正在编写一个应用程序,并且有一个自定义 View 。在此自定义 View 中,我必须计算不确定数量的点的位置。点数取决于我从数据库中读取的内容(因此每个用户的情况有所不同)。
所以,我的问题是,我怎样才能很好地解决这个问题?该应用程序的步骤如下:

  • Activity 开始
  • 数据库查询
  • 绘图

  • 问题是,当我打开 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/

    10-12 02:36