【问题标题】:Blackberry ActivityIndicator not seen during Http Connection在 Http 连接期间看不到 Blackberry ActivityIndi​​cator
【发布时间】:2011-12-11 02:56:18
【问题描述】:

我已经编写了底层代码以在进行 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");

但结果还是一样。

【问题讨论】:

    标签: blackberry httpconnection activity-indicator


    【解决方案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();
    

    【讨论】:

    • 嗨 Remy 我试过你的建议,但没有帮助。问题仍然存在。你能建议点别的吗?问候
    • 嗨 Remy,请查看我查询的更新(第二)部分。我想这就是你的建议。
    • 更接近了,但还没有到。不要使用invokeAndWait()。这迫使 HTTP 代码仍然在事件调度线程中运行 - 与运行 UI 的线程相同。您需要改为在其自己的线程中运行 HTTP 逻辑。为此使用Thread 类。它是Runnable 的后代。请致电 Thread.start() 而不是 UIApplication.invokeAndWait()。不要让您的主代码阻塞等待线程完成的事件调度线程。让线程调用 UIApplication.invokeLater() 在完成时向您的主代码发出信号。
    • 嗨@Remy,我成功使用了 Thread.start() 并且它在新线程中成功运行,但我无法让主线程等待新的线程......我无法了解如何在我的新线程中使用 UIApplication.invokeLater() 来向我的主线程发出信号。
    • 您不应该等待。让您的主代码在线程运行时继续执行其他操作(例如处理事件)。当线程完成时,invokeLater() 用于在主线程中运行另一段代码。我会用一个例子来更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多