2009-10-01 2 views
2

Мое приложение содержит большое количество изображений. поэтому для загрузки приложения требуется некоторое время. Я хочу показать экран загрузки, пока приложение загружается. Как это возможно ?Blackberry - Application loading screen

+0

http://stackoverflow.com/search?q=splash+screen – Groo

ответ

8

Вот пример приложения, скелеты которого вы хотите сделать. В основном, начальный экран, который вы нажимаете, является экраном загрузки. Во время начальной последовательности запуска вам нужно развернуть новый поток, выполнить загрузку, а затем использовать invokeLater, чтобы 1) убедиться, что ваш в диспетчере событий и 2) нажать новый экран - или, в случае этого примера, диалог - на экране, чтобы пользователь мог перейти от экрана загрузки.

Вот код:

import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.ui.component.Dialog; 
import net.rim.device.api.ui.component.LabelField; 

/** 
* Just a test app. 
*/ 
public class TestAppMain extends UiApplication 
{ 
    /** 
    * Default Constructor. 
    */ 
    private TestAppMain() {     
     pushScreen(new AppScreen(this));   
    } 

    /** 
    * App entry point. 
    * @param args Arguments. 
    */ 
    public static void main(String[] args) { 
     TestAppMain app = new TestAppMain();      
     app.enterEventDispatcher(); 
    } 

    /** 
    * Main application screen. 
    */ 
    private static class AppScreen extends MainScreen 
    { 
     UiApplication _app; 

     /** 
     * Default constructor. 
     */ 
     public AppScreen(UiApplication app) { 
      // Note: This screen just says "Loading...", but you could 
      // add a loading animation. 
      _app = app; 
      LabelField title = new LabelField("App Name", 
        LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH); 
      setTitle(title); 

      LabelField loading = new LabelField("Loading...", 
        LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH); 

      add(loading); 

      // Queue up the loading process. 
      startLoading(); 
     }    

     /** 
     * Create the loading thread. Make sure to invoke later as you will 
     * need to push a screen or show a dialog after the loading is complete, eventhough 
     * you are creating the thread before the app is in the event dispatcher. 
     */ 
     public void startLoading() { 
      Thread loadThread = new Thread() { 
       public void run() { 
        // Make sure to invokeLater to avoid problems with the event thread. 
        try{ 
         // Simulate loading time 
         Thread.sleep(5000); 
        } catch(java.lang.InterruptedException e){} 

        // TODO - Add loading logic here. 

        _app.invokeLater(new Runnable() {     
         public void run() {      
          // This represents the next step after loading. This just shows 
          // a dialog, but you could push the applications main menu screen. 
          Dialog.alert("Load Complete"); 
         } 
        }); 
       } 
      }; 
      loadThread.start(); 
     } 
    } 
} 
+1

Вы уверены, что правильно выполнить затянувшиеся задачи в методе UIApplication.invokeLater , invokeLater выполняет код в предоставленном методе запуска прямо на потоке диспетчера событий !!! – nixau

+0

@nixau Это действительная точка. Я переработал код, чтобы развернуть отдельный поток и использовать только invokeLater для изменения графического интерфейса. Спасибо – Fostah

+0

Как мне изменить код, если мне нужно добавить другой экран после всплеска вместо предупреждения о диалоге? Спасибо – Bohemian

1
   HorizontalFieldManager popHF = new HorizontalFieldManager(); 
       popHF.add(new CustomLabelField("Pls wait...")); 
       final PopupScreen waitScreen = new PopupScreen(popHF); 
       new Thread() 
       { 
        public void run() 
        { 

         synchronized (UiApplication.getEventLock()) 
         { 
          UiApplication.getUiApplication().pushScreen(waitScreen); 
         } 
         //Here Some Network Call 

         synchronized (UiApplication.getEventLock()) 
         { 
          UiApplication.getUiApplication().popScreen(waitScreen); 
         } 
        } 
       }.start(); 
+1

Ницца и образец для кого-то нового для платформы. Благодарю. –