这是一个伪代码:

class MoWeFi extends Activity

    static TouchSurfaceView TSV;
    static DrawRenderer mRenderer;
    static UserInterface mUI;
    DownloadData mDD = new DownloadData();
    static float zoom = 1.f;

    mDD.execute();
    mUI = new UserInterface();
    setContentView(mUI);


UserInterface类扩展LinearLayout
    MoWeFi.TSV = new TouchSurfaceView(context);
    MoWeFi.mRenderer =新的DrawRenderer(上下文);
    MoWeFi.TSV.setRenderer(MoWeFi.mRenderer);
    MoWeFi.TSV.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    this.addView(MoWeFi.TSV);

    TextView tv = new TextView(context);
    this.addView(tv);

    TextView tv2 = new TextView(context);
    this.addView(tv2);


类DownloadData扩展了AsyncTask
    保护的void doInBackground(){
        做{
        this.publishProgress();
        试试{Thread.sleep(1000); catch(InterruptedException e){}
        }在跑步的时候)
    }
    @Override
    受保护的void onProgressUpdate(){
    // ...
    MoWeFi.TSV.requestRender();
    MoWeFi.mUI.tv.setText(“ zoom =” + MoWeFi.zoom); // 这没用 !!!总是得到1.f.
    }

类TouchSurfaceView扩展了GLSurfaceView
    gl.glTranslatef(0,0,-1.f / MoWeFi.zoom); // 有用 !!!

DrawRenderer类实现GLSurfaceView.Renderer
    //捏缩放
    ...
    MoWeFi.zoom * = detector.getScaleFactor();
        MoWeFi.zoom = Math.max(0.5f,Math.min(MoWeFi.zoom,5.0f));

MoWeFi.mUI.tv2.setText("zoom="+MoWeFi.zoom); // IT WORKS !!!



因此,没有任何错误。只是无法在任何地方访问我的zoom变量。
我是Java的新手,我肯定错过了重要的概念。

编辑在第一行添加浮点数

编辑2在asyncTask中添加publishProgress

编辑3 logcat什么也没显示

最佳答案

您确定值更改后,您的AsyncTask是否访问属性?如果是,则AsyncTask在单独的线程上运行代码,因此您可能正面临一个竞争条件,即一个线程中更新的值在另一个线程中尚不可用。尝试使zoom属性具有可变性:

 public static volatile float zoom = 1.f;


或使用同步的获取/设置方法来变异和访问属性。

09-10 16:40