Доступ к значению с плавающей точкой в ​​AsyncTask - PullRequest
0 голосов
/ 18 августа 2011

Вот псевдокод:

class MoWeFi extends Activity</p>

<pre><code>    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);
</code>

класс UserInterface расширяет LinearLayout MoWeFi.TSV = новый TouchSurfaceView (контекст); 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 protected Void doInBackground () { делать{ this.publishProgress (); try {Thread.sleep (1000); catch (InterruptedException e) {} }во время бега) } @Override protected void onProgressUpdate () { // ... MoWeFi.TSV.requestRender (); MoWeFi.mUI.tv.setText ( "масштабирование =" + 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, мне, безусловно, не хватает важной концепции.

РЕДАКТИРОВАТЬ добавить float в первых строках

РЕДАКТИРОВАТЬ 2 добавить publishProgress в asyncTask

РЕДАКТИРОВАТЬ 3 logcat ничего не показывает

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

Вы уверены, что ваш AsyncTask получает доступ к свойству после изменения значения?Если да, AsyncTask запускает код в отдельном потоке, так что, вероятно, вы столкнулись с условием гонки, когда значение, обновленное в одном потоке, еще не доступно в другом.Попробуйте сделать свойство zoom энергозависимым:

 public static volatile float zoom = 1.f;

или используйте синхронизированные методы get / set для изменения и доступа к свойству.

0 голосов
/ 18 августа 2011

Существует проблема в объявлении переменной zoom. Вы должны явно указать компилятору Java, что такое zoom, это String, Integer, Float и т. Д.

Декларация должна выглядеть следующим образом:

public static int zoom = 100; для целочисленных значений.

public static String zoom = "My String"; для строковых значений.

public static double zoom = 1.4; для двойных значений и т. Д.

0 голосов
/ 18 августа 2011

изменить public static zoom = 1.f; на public static float zoom = 1.f;

...