在 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 中访问浮点值的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask介绍

用于图像获取的AsyncTask不断被调用

内部类可以访问但不能更新值 - AsyncTask

asynctask 函数无法识别结果值

AsyncTask 不返回值

如何获取AsyncTask 异步处理的返回值