gpt4 book ai didi

android - 使用不同的参数调用 AsyncTask

转载 作者:行者123 更新时间:2023-11-29 20:56:16 25 4
gpt4 key购买 nike

我想创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com