Я хочу показывать заставку, пока я не закончу с загрузкой XML-файлов с сервера и после завершения покажу следующий экран - PullRequest
1 голос
/ 14 сентября 2011

Я пытаюсь загрузить файлы xml с сервера при запуске моего приложения. Так что я хочу показать заставку, пока я не закончу с загрузкой, а затем показать следующий экран. ниже мой код:

Здесь я хочу показать мой экран-заставку, когда метод getTopNotDoc() выполняется. и после завершения этого метода показать следующий экран.

//get _topics and notification document<br>
_getDoc = new ServerConnectivity(this);

открытый класс ServerConnectivity {

private Document _questionDoc;
private Document _topics;
private Document _notifications;

public ServerConnectivity(ApplicationSession appSession){
    //getTopNotDoc();
    _this = this;
    _appSession = appSession;
            new Thread(new Runnable(){
               public void run(){   
           getTopNotDoc();
               }
            }).start();
    }
}


private void getTopNotDoc(){
    InputStream inputStream = null ;
    try{
        // Build a document based on the XML file.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        inputStream = getClass().getResourceAsStream("topics.xml");
        _topics = builder.parse( inputStream );
        inputStream = getClass().getResourceAsStream("notification.xml");
        _notifications = builder.parse( inputStream ); 

        if(_topics == null || _notifications == null){
                Dialog.alert("Unable to connect to internet");
        }
    } 
    catch ( Exception e ){
        System.out.println( e.toString() );
    }
    finally{
        if(inputStream != null){
            try {
                inputStream.close();
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 15 сентября 2011

Обычно, когда я делаю это, я создаю экран загрузки, а затем просто расширяю класс Thread.

Итак, я бы создал экран загрузки следующим образом:

public class LoadingScreen extends MainScreen {
public LoadingScreen() {
    super();
    this.setTitle("loading...");
    // add a spinning animated gif or whatever here

    final Screen me = this;
    new Thread(new Runnable(){
        public void run(){   
            // do something that takes a long time
            try { Thread.sleep(1000);} catch (Exception e) {}
        }
     }){
        public void run() {
            super.run();
            synchronized (UiApplication.getEventLock()) {
                UiApplication.getUiApplication().popScreen(me);
            }
        }
    }.start();
}
}

Затем я нажимаю на этот экран, он выполнит длинную задачу, а затем выскочит сам, когда это будет сделано. (вы можете или не можете отключить кнопку назад и меню на этом экране)

Я сделал Runnable анонимным внутренним классом просто для сжатия кода, но, вероятно, этот код уже есть в каком-то другом классе, поэтому вместо этого вы должны передать его.

1 голос
/ 17 сентября 2011

Чтобы добавить некоторую гибкость и сохранить слабую связь между вашими классами, вы можете внести некоторые изменения в свой класс ServerConnectivity, чтобы ваши вызовы могли выглядеть примерно так:

// push your splash screen on to the stack
//
final SplashScreen splashScreen = new SplashScreen();
UiApplication.getUiApplication().pushScreen(splashScreen);

_getDoc = new ServerConnectivity(this, new ServerConnectivityListener() {
    public void onCompleted(ServerConnectivity sender) {

        // display next screen
        //
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                splashScreen.close();
                UiApplication.getUiApplication().pushScreen(new NextScreen());
            }
        });
    }

    public void onError(ServerConnectivity sender) {
        splashScreen.close();
        // display error message, retry, etc...
    }
 });

Чтобы это работало,вам нужен интерфейс со следующим определением:

public interface ServerConnectivityListener {
    void onCompleted(ServerConnectivity sender);
    void onError(ServerConnectivity sender);
}

Итак, ваш класс ServerConnectivity поддерживает ссылку на некоторый объект, который реализует интерфейс с именем ServerConnectivityListener Это позволяет вам поддерживать слабую связь между классом субъектаи любые наблюдатели, которым нужно прослушивать события.

Внутри ServerConnectivity вы бы вызывали методы слушателя примерно так:

// begin excerpt from above...
//
if(_topics == null || _notifications == null) {
     _listener.onError(this);
} else {
    _listener.onCompleted(this);
}
catch ( Exception e ){
    System.out.println( e.toString() );
    _listener.onError(this);
//
// end excerpt from above...
1 голос
/ 14 сентября 2011

Так как он основан на потоке, мы не можем сделать это обычным способом. Так Проверьте следующую ссылку

http://supportforums.blackberry.com/t5/Java-Development/What-is-the-Event-Thread/ta-p/446865

и проверьте, выполняется ли анализ, покатот же экран, проверьте состояние, загружен он или нет, а затем нажмите на экран

1 голос
/ 14 сентября 2011

Вот код для заставки в Java ........ после и вызов этого представления .........

http://www.randelshofer.ch/oop/javasplash/javasplash.html

import java.awt.*;
import java.awt.event.*;

public class SplashTest extends Frame implements ActionListener {
    static void renderSplashFrame(Graphics2D g, int frame) {
        final String[] comps = {"foo", "bar", "baz"};
        g.setComposite(AlphaComposite.Clear);
        g.fillRect(130,250,280,40);
        g.setPaintMode();
        g.setColor(Color.BLACK);
        g.drawString("Loading "+comps[(frame/5)%3]+"...", 130, 260);
        g.fillRect(130,270,(frame*10)%280,20);
    }
    public SplashTest() {
        super("SplashScreen demo");
        setSize(500, 300);
        setLayout(new BorderLayout());
        Menu m1 = new Menu("File");
        MenuItem mi1 = new MenuItem("Exit");
        m1.add(mi1);
        mi1.addActionListener(this);

        MenuBar mb = new MenuBar();
        setMenuBar(mb);
        mb.add(m1);
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }
        Graphics2D g = (Graphics2D)splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
        for(int i=0; i<100; i++) {
            renderSplashFrame(g, i);
            splash.update();
            try {
                Thread.sleep(200);
            }
            catch(InterruptedException e) {
            }
        }
        splash.close();
        setVisible(true);
        toFront();
    }
    public void actionPerformed(ActionEvent ae) {
        System.exit(0);
    }
    public static void main (String args[]) {
        SplashTest test = new SplashTest();
    }
}
...