J2ME - wątki...

0

Witam,
mam problem. Potrzebuję stworzyć sobie obiekt, podobny do Alert, ale posadzić go na Canvas. Chodzi mi o to, żeby pojawił się na ekranie, a następnie po ustalonym czasie zniknął, i przekazał Display innemu obiektowi. Używałem do tego celu metody sleep, ale chyba w niewłaściwy sposób, ponieważ uruchamiałem wątek w konstruktorze tej klasy, co za tym idzie, wątek spał, niczym wykonała się metoda paint. A ja chcę, żeby najpierw Canvas się odrysował, a później poczekał kilka sekund, a następnie chcę uruchomić konstruktor zupełnie innej klasy.
Jestem nowy w ME, i nie wiem, czy poprawnie przekazuję Display: a mianowicie posiadam statyczną metodę, która zwraca Display, i dzięki temu, mogę go uzyskać z dowolnej klasy. Działa, ale nie wiem, czy to eleganckie, choć spotkałem się z tym w jakiejś książce.
Dzięki wielkie, pozdrawiam.

0

Nie wiem czy powoływanie nowego wątku u ciebie będzie dobrą rzeczą, jeśli chcesz coś zrobić nowego dopiero po zniknięciu allert'a. Moze wykozystaj wait'a

synchronized(this){

  try{
   wait(1000);//w milisekundach

}catch(...){..}


}

0

Ale gdzie to mam mieć? W metodzie run? (wykorzystuje interfejs Runnable). Mój konstruktor tego wyskakującego okienka wygląda tak:

    public CWelcome()
    {
        Display.getDisplay(CMain.getMidlet()).setCurrent(this);
        setCommandListener(this);

        this.run();
        
    } 

Natomiast metoda run wygląda następująco:

 public void run() {
        
        synchronized(this){
            try {
                wait(1000); //w milisekundach
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

        }

        new CMenu();
    }

Jak widać, w tej metodzie uruchamiany jest konstruktor nowej klasy. Ona, dzięki statycznej metodzie, która zwraca display, potrafi się narysować na ekranie... Ale sytuacja wygląda tak, że metoda paint klasy CWelcom, jest uruchamiana później, niz konstruktor klasy CMenu... trochę tego nie rozumiem. Wiem to, ponieważ dopisałem sobie linijki debuggery na konsolę. Proszę o pomoc :)

0

Chcesz sobie zrobić taki splash, co nie?

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;


public class Splash extends Canvas
{
	Display display;
	Displayable next;
	
	public Splash(Display disp, Displayable next)
	{
		disp.setCurrent(this);
		this.display = disp;
		this.next = next;
	}
	
	protected void paint(Graphics g)
	{
		// TODO implementacja: rysowanie logo czy cos...
	}

	public void sleep()
	{
		try
		{
			Thread.sleep(3000);
		} catch (InterruptedException e)
		{}
		display.setCurrent(next);
	}

}

przykladowe uzycie:

		Displayable displayable = new Canvas(){ public void paint(Graphics g){}};
		Display display = Display.getDisplay( this );
		new Splash(display, displayable).sleep();
		// w tym miejscu program zaczyna normalnie dzialac po splashu...
0

Bardzo sprytne, podoba mi się, dzięki wielkie; patrząc na kod wydaje mi się, że zahula. Zaraz zakoduję w wersji dla siebie :) Wielkie thx!;)

0

Mhm... jednak mi to nie działa :/ Po wywołaniu new Splash(..... rzeczywiście odczekiwane jest 3 sekundy, ale nie odmalowuje się nic z paint.
Ekran pozostaje po prostu biały... Poza tym, nie czaję do końca po co to pole Displayable...

0

Nie ma mowy aby w jednowątkowym GUI sleep był do czegokolwiek przydatny skoro ta metoda zatrzymuje cały wątek. Potrzebny jest wyzwalacz, który odpali jakikolwiek komunikat lub metodę użytkownika po trzech sekundach. Normalnie użyłoby się do tego jakiegoś timera. GUI zawsze "musi się kręcić".
Bez użycia timera można to zrobić w ten sposób, że jedna z metod Twojego obiektu musi być uruchamiana co jakiś ułamek sekundy tylko po to, żeby sobie sprawdzić bieżący czas i porównać z czasem zapisanym w konstruktorze. Jeżeli minie potrzebny okres, wtedy może odpalić display.setCurrent(następneOkno).
Jedyne Co Cię interesuje, to albo zmuszenie GUI do regularnego wywoływania jakiejś metody z Twojej klasy co jakiś krótki czas (ułamek sekundy). Niestety nie znam Java ME na tyle, żeby poradzić czego konkretnie użyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1