Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从异步任务在画布上绘制?_Android_Canvas - Fatal编程技术网

Android 如何从异步任务在画布上绘制?

Android 如何从异步任务在画布上绘制?,android,canvas,Android,Canvas,我有一个名为RectLine的类,它从AsyncTask扩展而来。 在MainActivity类中,在方法onDraw(画布)中创建一个RectLine(l1)对象。我还传递了画布的引用并绘制绘制所需的对象。然而,当我调用l1.execute()方法时,我在屏幕上看不到任何东西。 我只能看到我在doInBackground方法上打印的日志消息,因此我确信代码执行得很好。 但设备屏幕上没有打印任何内容 @Override protected void onDraw(Canvas c

我有一个名为RectLine的类,它从
AsyncTask
扩展而来。 在
MainActivity
类中,在方法
onDraw(画布)
中创建一个
RectLine
l1
)对象。我还传递了
画布的引用
并绘制绘制所需的对象。然而,当我调用
l1.execute()
方法时,我在屏幕上看不到任何东西。 我只能看到我在
doInBackground
方法上打印的日志消息,因此我确信代码执行得很好。 但设备屏幕上没有打印任何内容

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.parseColor("#CD5C5C"));


        //new LineaRecta(x1, y1, x2, y2, b)
        LineaRecta l1 = new LineaRecta(0, getHeight(), getWidth(), 0, getHeight());

        LineaRecta l1 = new LineaRecta( 0, getHeight(), getWidth(), 0, getHeight());
        l1.setAnchoCanvas(getWidth());
        l1.setCanva(canvas);
        l1.setPaint(paint);
        l1.execute();
    }

 @Override
protected Void doInBackground(Void... voids) {
    float y;        
    for(float x=0; x<anchoCanvas;x++){
        y=(m*x)+b;
        canvas.drawCircle(x, y, Punto.RADIO, paint);                      
    }
    return null;
} 
@覆盖
受保护的void onDraw(画布){
super.onDraw(帆布);
油漆=新油漆();
paint.setColor(Color.parseColor(#CD5C5C));
//新线性矩形(x1,y1,x2,y2,b)
LineaRecta l1=新的LineaRecta(0,getHeight(),getWidth(),0,getHeight());
LineaRecta l1=新的LineaRecta(0,getHeight(),getWidth(),0,getHeight());
l1.setAnchoCanvas(getWidth());
l1.setCanva(帆布);
l1.设置油漆(油漆);
l1.execute();
}
@凌驾
受保护的空位背景(空位…空位){
浮动y;

对于(float x=0;x我认为您不能在
doInBackground(Void…voids)
中使用以下行:


为了实现目标,您可以在后台计算仍在运行时调用UI线程,方法是在doInBackground方法中调用publishProgress()以下方法。

要从后台在mainUI线程中执行某些操作,请使用此包装器:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                //do something
            }
        });
要重新绘制视图,请使用以下代码:


myview.invalidate();
是,要重新绘制视图,请使用以下代码:


myview.invalidate();这是主UI线程的重点。尽管在异步任务中,您可以实现onPostExecute()方法,然后调用UI线程来绘制圆。您可以使用后台线程来告诉UI线程绘制一些东西,但不能直接从后台线程绘制。然后在
onProgressUpdate()
中进行绘制,OP需要在AsyncTask子类中重写该操作。
runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                //do something
            }
        });