这是一个伪代码:
class MoWeFi extends Activitystatic 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;
或使用同步的获取/设置方法来变异和访问属性。