Blackberry ActivityIndicator не виден во время соединения Http - PullRequest
0 голосов
/ 19 октября 2011

Я написал базовый код для отображения индикатора активности, когда выполняется соединение 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");

Но результат остается тем же.

1 Ответ

1 голос
/ 19 октября 2011

Поскольку вы используете invokeAndWait (), выполняете ли вы операцию HTTP в рабочем потоке? Если нет, вы должны быть. ActivityIndicator должен управляться в основном потоке диспетчеризации, а операция 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();
...