我想创建一个 AsyncTask 以在渲染过程后将 Canvas 发布到 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 做我想做的事?
已编辑
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);
但是如果我运行我的应用程序,我的 View 不会更新?
最佳答案
doInBackground 方法中的渲染器变量是一个渲染器对象数组。当您调用 AsyncTask execute() 方法时,您正在传递此数组:
new MyAsyncTask().execute(new Renderer());
我不知道你的渲染器对象是什么,所以你可以传递我的 new Renderer() 而不是你需要的任何东西。 然后在 doInBackground 中你可以用 next 得到这个对象
@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 方法即可。
已编辑
还有一个 - 你的 MyAsyncTask 应该扩展 AsyncTask :第一个是你传递给 AsyncTask 的对象类型,第二个是在任务运行时传递给方法 onProgressUpdate,最后一个是你的任务返回主线程的类型。
关于android - 使用不同的参数调用 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27629535/