在 AsyncTask 中访问浮点值
Posted
技术标签:
【中文标题】在 AsyncTask 中访问浮点值【英文标题】:Accessing a float value in AsyncTask 【发布时间】:2011-10-29 15:26:49 【问题描述】:这是一个伪代码:
MoWeFi 类扩展了 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 = 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);
类 DownloadData 扩展 AsyncTask 受保护的无效 doInBackground() 做 this.publishProgress(); 尝试Thread.sleep(1000);catch (InterruptedException e) 在跑步的时候) @覆盖 受保护的无效 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 !!!
所以没有任何错误。只是无法在任何地方访问我的缩放变量。 我是 Java 新手,我肯定错过了重要的概念。
EDIT在第一行添加浮点数
EDIT 2在 asyncTask 中添加 publishProgress
EDIT 3 logcat 什么都不显示
【问题讨论】:
我要求删除...因为问题在我这边并且在此示例中不可见:我处于无法访问的区域。愚蠢的 !我在帖子的顶部解释了这一点,并为回复的人道歉。但是被版主删了。不明白。谢谢大家。 【参考方案1】:您确定您的AsyncTask
在值更改后访问该属性吗?如果是,AsyncTask
在单独的线程上运行代码,因此您可能正面临竞争条件,其中一个线程中更新的值在另一个线程中尚不可用。尝试使zoom
属性可变:
public static volatile float zoom = 1.f;
或使用同步的 get/set 方法来改变和访问属性。
【讨论】:
我编辑了我的伪代码,我们可以看到 asyncTask 每秒发布一次。所以它应该能够几乎连续地访问该属性。我尝试“易失性”并同步获取,但到目前为止还没有运气。谢谢,无论如何对我有用的答案。【参考方案2】:将此public static zoom = 1.f;
更改为public static float zoom = 1.f;
【讨论】:
【参考方案3】:缩放变量的声明有问题。必须明确告诉 java 编译器什么是缩放,是 String、Integer、Float 等。
声明应该是这样的:
public static int zoom = 100;
用于整数值。
public static String zoom = "My String";
用于字符串值。
public static double zoom = 1.4;
用于双精度值等。
【讨论】:
谢谢,但这只是一个复制错误,如果是这样我会出错并且我将无法运行我的程序。以上是关于在 AsyncTask 中访问浮点值的主要内容,如果未能解决你的问题,请参考以下文章