В моем приложении много изображений. поэтому для загрузки приложения требуется некоторое время. Я хочу показать экран загрузки во время загрузки приложения. Как это возможно ?
Blackberry - экран загрузки приложения
comment
stackoverflow.com/search?q=splash+screen
- person Groo   schedule 01.10.2009
Ответы (2)
Вот пример приложения, которое отображает то, что вы хотите сделать. По сути, начальный экран, который вы нажимаете, - это экран загрузки. Во время начальной последовательности запуска вам нужно запустить новый поток, выполнить загрузку, а затем использовать invokeLater для 1) убедитесь, что вы находитесь в диспетчере событий и 2) для нажатия нового экрана - или в случае этого примера a dialog - на экран, чтобы пользователь уходил с экрана загрузки.
Вот код:
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();
}
}
}
person
Fostah
schedule
01.10.2009
Вы уверены, что в методе UIApplication.invokeLater правильно выполнять длительную задачу? invokeLater выполняет код в предоставленном методе выполнения прямо в потоке диспетчера событий !!!
- person nixau; 02.10.2009
@nixau Это верная точка зрения. Я переработал код, чтобы развернуть отдельный поток и использовать invokeLater только для изменения графического интерфейса. Спасибо
- person Fostah; 03.10.2009
Как мне изменить код, если мне нужно добавить еще один экран после заставки вместо диалогового окна? Спасибо
- person Bohemian; 05.11.2009
person
schedule
Хороший образец для новичков в платформе. Спасибо.
- person Andro Selva; 06.09.2013