[SOLVED][J2ME] TimerTask

0

Witam mam problem. Chciałbym, aby wywoływała mi się funkcja, która pokazuje dokładna godzinę, i żeby wywoływała się co 1s.

mam taki kod:

private Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
private Timer timer=null;

[...]
	TimerTask task = new TimerTask()
	{
		public void run()
		{
			Plotno.this.obecnie(cal.get(cal.HOUR),cal.get(cal.MILLISECOND));
		}
	};

[...]

timer = new Timer();
		timer.schedule(task, 0, 1000);

tylko że mam jeden problem. Otóż nie odświeża mi tej godziny(nie aktualizuje zmiennych), natomiast gdy wywołuję te funkcje za pomocą przyciśnięcia przycisku funkcji to wykonuje...

0

A próbowałeś przesunąć pierwsze wywołanie na sekundę później?
timer.schedule(task, 1000, 1000);
Czasem mi też nie działa jeżeli delay jest równe zero.

0

jak dam opóźnienie o 1s to mi się odświeża ale tylko 1 raz...

taki mam dokładnie kod z pominięciem nieistotnych funkcji:

package planlekcjipakiet;
import javax.microedition.lcdui.*;

import java.util.*;

public class Plotno extends Canvas implements CommandListener{
	
	private Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
	private int dzienTygodnia=cal.get(Calendar.DAY_OF_WEEK);
	private PlanLekcjiMIDlet Midlet;
	private Command koniec = new Command("Wyjście",Command.EXIT,0);
	private Command szczegolowy = new Command("Obecnie",Command.OK,0);
	private Command ogolny = new Command("Ogólny",Command.OK,1);
	private Timer timer=null;
	
	

	TimerTask task = new TimerTask()
	{
		public void run()
		{
			
			Plotno.this.obecnie(Plotno.this.cal.get(cal.HOUR_OF_DAY),cal.get(cal.SECOND));
			repaint();
		}
	};
	
	public Plotno(PlanLekcjiMIDlet midlet)
	{
		
		bufor = Image.createImage(240,320);
		bg = bufor.getGraphics();	
		
		this.addCommand(koniec);
		this.addCommand(szczegolowy);
		this.addCommand(ogolny);
		this.setCommandListener(this);
		
		rysujPlan();
		Midlet = midlet;
	}
	
	public void obecnie(int godzina,int minuta)
	{
		
		dzienTygodnia=cal.get(Calendar.DAY_OF_WEEK);
		String dzien="";
		switch(dzienTygodnia)
		{
		case 0: dzien="Sobotę";
		break;
		case 1: dzien="Niedzielę";
		break;
		case 2: dzien="Poniedziałek";
		break;
		case 3: dzien="Wtorek";
		break;
		case 4: dzien="Środę";
		break;
		case 5: dzien="Czwartek";
		break;
		case 6: dzien="Piątek";
		break;
		}
		
		this.removeCommand(szczegolowy);
		this.addCommand(ogolny);
		this.setCommandListener(this);
		this.ustawKolor(255, 255, 255);
		this.rysujProstokat(0, 0, 240, 320, true);
		this.ustawKolor(0, 0, 0);
		this.rysujLinie(0, 30, 240, 30);
		this.ustawCzcionke(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
		this.napiszText("Dzisiaj mamy "+dzien+" "+minuta+" "+godzina, 120, 13, Graphics.BASELINE|Graphics.HCENTER);
		
	}
	
	
	
    protected void paint(Graphics g)
    {
    	g.setColor(255, 255, 255);
    	g.fillRect(0, 0, 240, 320);
    	g.drawImage(bufor, 0, 0, Graphics.TOP|Graphics.LEFT);
    }
    
    public void commandAction(Command c, Displayable s)
	{
		if(c.getCommandType() == Command.EXIT)
			Midlet.notifyDestroyed();
		if(c.getCommandType() == Command.OK && c.getPriority()==0)
		{
			timer = new Timer();
			cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
			timer.schedule(task, 1000, 1000);
			this.obecnie(cal.get(cal.HOUR_OF_DAY),cal.get(cal.SECOND));
		}
		if(c.getCommandType() == Command.OK && c.getPriority()==1)
		{
			this.rysujPlan();
		}
		
	}

}

0

Z tego co widzę, to :

  1. W commandAction do pola "cal" przypisujesz nową instancję kalendarza, tym samym aktualizując czas.

  2. W TimerTasku tego nie robisz - używasz kalendarza stworzonego na samym początku programu, czyli cały czas tego samego, z tym samym czasem.

Moim zdaniem to powoduje problem.

0

To jest już któraś z kolei wersja kodu w TimerTask'u tez już dawałem nową instancje, teraz tak namieszałem że już mi w ogóle nie działa i muszę znaleźć ten błąd na razie...

//edit

Już problem rozwiązany wystarczyło do run dodać

Date d = new Date();
cal.setTime(d);

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