使用不同的参数调用AsyncTask

时间:2014-12-23 23:32:03

标签: android android-asynctask surfaceview

我想创建一个AsyncTask,在渲染过程后将画布发布到SurfaceView。但我想知道我如何访问我给AsyncTask的变量?所以在我想开始渲染之前,我必须得到Canvas并将它交给我的Render类。但这不起作用:

public class MyAsyncTask extends AsyncTask<DrawingView, SurfaceHolder, Renderer>{
private Canvas cv = null;

@Override
protected void onPreExecute(){
    this.cv = SurfaceHolder.lockCanvas(); //get canvas
}

@Override
protected Canvas doInBackground(Renderer...render){
    render.canvas = this.cv; //give the canvas to the renderer
    render.RenderOneStep(); //rendering
    return render.DisplayResult(); //gives back a canvas
}

@Override
protected void onPostExecute(Canvas canvas){
    this.SurfaceHolder.unlockCanvasAndPost(canvas); //post canvas back to surfaceHolder
    this.DrawingView.postInvalidate(); //update SurfaceView
}

}

是否可以使用AsyncTask执行我想要的操作?

EDITED

MyAsyncTask现在看起来像这样:

public class MyAsyncTask extends AsyncTask<Object,Void,Canvas>{

private DrawingView dView = null;
private SurfaceHolder holder = null;

@Override
protected Canvas doInBackground(Object...obj){
    dView = (DrawingView)obj[0];
    holder = (SurfaceHolder)obj[1];
    Renderer renderer = (Renderer)obj[2];

    Canvas cv = holder.lockCanvas();
    renderer.canvas = cv;
    renderer.RenderOneStep(); //rendering
    return renderer.DisplayResult(); //returns a canvas
}

@Override
protected void onPostExecute(Canvas canvas){
    holder.unlockCanvasAndPost(canvas);
    dView.postInvalidate();
    Log.e("Info-->", "Done!");
}

}

在我的MainActivity中,我在 surfaceCreated事件

中调用它
Canvas cv = holder.lockCanvas();
this.render = new Renderer(new Scene(), cv, new Vector3D(0.0f, 0.0f, 10.0f), 4);
holder.unlockCanvasAndPost(cv);
new MyAsyncTask().execute(dView, holder, render);

但如果我运行我的应用程序,我的视图不会更新?

1 个答案:

答案 0 :(得分:2)

doInBackground方法中的renderer变量是Renderer对象的数组。在调用AsyncTask execute()方法时传递此数组:

new MyAsyncTask().execute(new Renderer());

我不知道你的渲染器对象是什么,所以你可以通过我的新Renderer()传递任何你需要的东西。 然后在doInBackground中,您可以使用下一个

获取此对象
@Override
protected Canvas doInBackground(Renderer...renders){
    Renderer render = renders[0];

    render.canvas = SurfaceHolder.lockCanvas(); //give the canvas to the renderer
    render.RenderOneStep(); //rendering
    return render.DisplayResult(); //gives back a canvas
}

现在只需删除onPreExecute方法。

<强> EDITED

还有一个 - 你的MyAsyncTask应该扩展AsyncTask:首先是你传递给AsyncTask的对象类型,第二个是在任务运行时传递给onProgressUpdate方法,最后一个是你的任务返回主线程的类型。