这是一个伪代码:
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);
class UserInterface extends LinearLayout MoWeFi.TSV = new TouchSurfaceView(context); MoWeFi.mRenderer = new DrawRenderer(context); 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);
class DownloadData extends AsyncTask protected Void doInBackground(){ do{ this.publishProgress(); try{Thread.sleep(1000);catch (InterruptedException e){} }while(running) } @Override protected void onProgressUpdate(){ //... MoWeFi.TSV.requestRender(); MoWeFi.mUI.tv.setText("zoom="+MoWeFi.zoom); // IT DOES NOT WORK !!! ALWAYS GET 1.f. }
class TouchSurfaceView extends GLSurfaceView gl.glTranslatef(0, 0, -1.f / MoWeFi.zoom); // IT WORKS !!!
class DrawRenderer implements GLSurfaceView.Renderer //Pinch-zoom ... 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 !!!
所以没有任何错误。只是无法在任何地方访问我的缩放变量。 我是Java的新手,我肯定错过了重要的概念。
编辑在第一行添加浮动
编辑2 在asyncTask中添加publishProgress
编辑3 logcat不显示任何内容
答案 0 :(得分:2)
您确定AsyncTask
在值更改后访问该属性吗?如果是,AsyncTask
在一个单独的线程上运行代码,那么您可能面临竞争条件,其中一个线程中更新的值在另一个线程中尚未可用。尝试将zoom
属性设为volatile:
public static volatile float zoom = 1.f;
或使用synchronized get / set方法来变异和访问属性。
答案 1 :(得分:0)
按public static zoom = 1.f;
public static float zoom = 1.f;
答案 2 :(得分:0)
缩放变量的声明存在问题。你必须明确地告诉java编译器什么是zoom,它是String,Integer,Float等。
宣言应该如下:
public static int zoom = 100;
表示整数值。
public static String zoom = "My String";
表示字符串值。
public static double zoom = 1.4;
表示双值等等。