我想创建一个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);
但如果我运行我的应用程序,我的视图不会更新?
答案 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方法,最后一个是你的任务返回主线程的类型。