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

标签 android android-asynctask surfaceview

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

相关文章:

java - 在phonegap android应用程序中使用什么来代替已弃用的 "LegacyContext"类型?

android - 在 aChartEngine 中对 XYSeries 使用 remove(int index) 函数

android - 处理绘图/绘画/保存多个位图

java - 异步任务后无法更改文本

android - 想要在 android 相机中一次捕获多个图像

android - 在自定义 SurfaceView 中添加自定义 View

android - 当单个选项卡中存在多个 Activity 时,模拟器上的后退按钮出现问题

java - 不同编码的 HTTP Post 请求正文(字符集)

android - 开始视频录制时屏幕闪烁并调整大小

Android 导航组件 Unresolved reference