0

hhtp 接続呼び出しが行われている間、アクティビティ インジケーターを表示するための基になるコードを作成しました。残念ながら、http 接続の呼び出しが完了するまで、アクティビティ インジケータは画面に表示されません。したがって、それはその目的を果たしていません。

UiApplication.getUiApplication().invokeAndWait(new Runnable()
                {
                  public void run()
                  {

                       ActivityIndicatorView view = new ActivityIndicatorView(Field.USE_ALL_WIDTH);
                        ActivityIndicatorModel model = new ActivityIndicatorModel();
                        ActivityIndicatorController controller = new ActivityIndicatorController();

                        view.setController(controller);
                        view.setModel(model);

                        controller.setModel(model);
                        controller.setView(view);

                        model.setController(controller);        

                        Bitmap bitmap = Bitmap.getBitmapResource("spinner.png");
                        view.createActivityImageField(bitmap, 5, Field.FIELD_HCENTER);

                        _activityFieldManager.add(view);
                          UiApplication.getUiApplication().getActiveScreen().invalidate();

                  }
                });
                //SyncWithDB is the Class that makes the Http connection call
                new SyncWithDB();
                _activityFieldManager.delete(view);
                UiApplication.getUiApplication().getActiveScreen().invalidate();
                Dialog.inform("Sync Complete");

提案されたように、私も試しました

view = new ActivityIndicatorView(Field.USE_ALL_WIDTH);
                ActivityIndicatorModel model = new ActivityIndicatorModel();
                ActivityIndicatorController controller = new ActivityIndicatorController();

                view.setController(controller);
                view.setModel(model);

                controller.setModel(model);
                controller.setView(view);

                model.setController(controller);        

                Bitmap bitmap = Bitmap.getBitmapResource("spinner.png");
                view.createActivityImageField(bitmap, 5, Field.FIELD_HCENTER);

                _activityFieldManager.add(view);
                  UiApplication.getUiApplication().getActiveScreen().invalidate();

                UiApplication.getUiApplication().invokeAndWait(new Runnable()
                {
                  public void run()
                  {

                      try {
                        new SyncWithDB();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                  }
                });


                _activityFieldManager.delete(view);
                UiApplication.getUiApplication().getActiveScreen().invalidate();
                Dialog.inform("Sync Complete");

しかし、結果は同じままです。

4

1 に答える 1

1

invokeAndWait() を使用しているため、ワーカー スレッドで HTTP 操作を実行していますか? そうでない場合は、そうする必要があります。ActivityIndi​​cator はメイン ディスパッチ スレッドで管理し、HTTP 操作はワーカー スレッドで管理する必要があります。

例えば:

view = new ActivityIndicatorView(Field.USE_ALL_WIDTH);
ActivityIndicatorModel model = new ActivityIndicatorModel();
ActivityIndicatorController controller = new ActivityIndicatorController();

view.setController(controller);
view.setModel(model);

controller.setModel(model);
controller.setView(view);

model.setController(controller);        

Bitmap bitmap = Bitmap.getBitmapResource("spinner.png");
view.createActivityImageField(bitmap, 5, Field.FIELD_HCENTER);

_activityFieldManager.add(view);
UiApplication.getUiApplication().getActiveScreen().invalidate();

Thread thread = new Thread()
{
  public void run()
  {
    try {
      new SyncWithDB();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    UiApplication.getUiApplication().invokeLater(
      new Runnable()
      {
        protected void run()
        {
          _activityFieldManager.delete(view);
          UiApplication.getUiApplication().getActiveScreen().invalidate();
          Dialog.inform("Sync Complete");
        }
      }
    );
  }
}
thread.start();

または、もう少し一般的に:

ActivityIndicatorView view;
ActivityFieldManager _activityFieldManager;

class SyncFinished extends Runnable
{
  public void run()
  {
    _activityFieldManager.delete(view);
    UiApplication.getUiApplication().getActiveScreen().invalidate();
    Dialog.inform("Sync Complete");
  }
}

class SyncThread extends Thread
{
  Runnable runWhenFinished;

  public SyncThread(Runnable r)
  {
    super();
    runWhenFinished = r;
  }

  public void run()
  {
    try {
      new SyncWithDB();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    if (runWhenFinished != null)
      UiApplication.getUiApplication().invokeLater(runWhenFinished);
  }
}

view = new ActivityIndicatorView(Field.USE_ALL_WIDTH);
ActivityIndicatorModel model = new ActivityIndicatorModel();
ActivityIndicatorController controller = new ActivityIndicatorController();

view.setController(controller);
view.setModel(model);

controller.setModel(model);
controller.setView(view);

model.setController(controller);        

Bitmap bitmap = Bitmap.getBitmapResource("spinner.png");
view.createActivityImageField(bitmap, 5, Field.FIELD_HCENTER);

_activityFieldManager.add(view);
UiApplication.getUiApplication().getActiveScreen().invalidate();

SyncThread thread = new SyncThread(new SyncFinished());
thread.start();
于 2011-10-19T18:30:06.947 に答える