Witam
Mam nietypowy problem ze zmiennymi typu Date. Problem pojawia się, gdy uruchamiam middlet na telefonie, który nie posiada zgodności z MIDP 2.1 (np. Nokia 3310 Classic, SE 550).
Natomiast na emulatorze i telefonie z MIDP2.1 (np. Nokia E52) wszystko działa OK.
Problem polega na tym, że wartości zmiennych nadpisują się i wszystkie zmienne na telefonach z MIDP 2.0 mają tą samą wartość.
Przykładowy program:
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Daty extends MIDlet implements CommandListener{
Command koniec;
private String fData(Date D)
{
String RRRR, MM, DD;
Calendar K = Calendar.getInstance();
K.setTime(D);
int rok = K.get(Calendar.YEAR);
int mies = K.get(Calendar.MONTH)+1;
int dzien = K.get(Calendar.DAY_OF_MONTH);
RRRR = "" + rok;
if (mies < 10)
{
MM = "0" + mies;
}
else
{
MM = "" + mies;
}
if (dzien < 10)
{
DD = "0" + dzien;
}
else
{
DD = "" + dzien;
}
return new String(DD + "." + MM + "." + RRRR);
}
public void startApp()
{
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;
Display dis;
Form fF;
dis = Display.getDisplay(this);
fF = new Form("Daty");
koniec=new Command("Koniec",Command.EXIT,0);
fF.addCommand(koniec);
//Date dzis;
Calendar tKal = Calendar.getInstance();
Date Dzis = new Date();
tKal.setTime(Dzis);
tKal.set(Calendar.HOUR_OF_DAY, 0);
tKal.set(Calendar.MINUTE, 0);
tKal.set(Calendar.SECOND, 0);
tKal.set(Calendar.MILLISECOND, 0);
Dzis = tKal.getTime();
StringItem s10=new StringItem(null, "Dzis= " + fData(Dzis));
fF.append(s10);
Spacer przerwa10=new Spacer(fF.getWidth(),1);
fF.append(przerwa10);
long ltKal = Dzis.getTime();
ltKal -= MILLIS_PER_DAY;
tKal.setTime(new Date(ltKal));
Date Wczoraj = new Date();
Wczoraj = tKal.getTime();
StringItem s11=new StringItem(null, "Wczoraj= " + fData(Wczoraj));
fF.append(s11);
Spacer przerwa11=new Spacer(fF.getWidth(),1);
fF.append(przerwa11);
ltKal += 2L * MILLIS_PER_DAY;
tKal.setTime(new Date(ltKal));
Date Jutro = new Date();
Jutro = tKal.getTime();
StringItem s12=new StringItem(null, "Jutro= " + fData(Jutro));
fF.append(s12);
Spacer przerwa12=new Spacer(fF.getWidth(),1);
fF.append(przerwa12);
StringItem s13=new StringItem(null, "A może tak:");
fF.append(s13);
Spacer przerwa13=new Spacer(fF.getWidth(),1);
fF.append(przerwa13);
StringItem s0=new StringItem(null, "Dzis= " + fData(Dzis));
fF.append(s0);
Spacer przerwa0=new Spacer(fF.getWidth(),1);
fF.append(przerwa0);
StringItem s1=new StringItem(null, "Wczoraj= " + fData(Wczoraj));
fF.append(s1);
Spacer przerwa1=new Spacer(fF.getWidth(),1);
fF.append(przerwa1);
StringItem s2=new StringItem(null, "Jutro= " + fData(Jutro));
fF.append(s2);
fF.setCommandListener(this);
dis.setCurrent(fF);
}
public void pauseApp(){}
public void destroyApp(boolean b){}
public void commandAction(Command c,Displayable d)
{
notifyDestroyed();
}
}
Program ten uruchomiony na emulatorze da następujący wynik:
Dzis= 07.07.2011
Wczoraj= 06.07.2011
Jutro= 08.07.2011
A może tak:
Dzis= 07.07.2011
Wczoraj= 06.07.2011
Jutro= 08.07.2011
Natomiast uruchamiając program na komórce z MIDP2.0 zobaczymy:
Dzis= 07.07.2011
Wczoraj= 06.07.2011
Jutro= 08.07.2011
A może tak:
Dzis= 08.07.2011
Wczoraj= 08.07.2011
Jutro= 08.07.2011
Middlet kompiluję JWTK v2.5.2 z ustawionym MIDP 2.0 i CLDC 1.1. Być może problem ten wynika z mojego błędu, nie jestem zawodowym programistą. Proszę o pomoc, jak można rozwiązać ten problem. – Dodane 11.07.2011 (Pn) 8:11 – Witam ponownie. Udało mi się rozwiązać ten problem, chociaż jest to raczej rozwiązanie z gatunku “protez”. Ale działa Po prostu dla każdej zmiennej typu Date utworzyłem oddzielny obiekt typu Calendar. Teraz wynik działania midletu zarówno na emulatorze, jak i na komórkach typu SE550, Samsung Avila jest prawidłowy. Jednak nie jest eleganckie rozwiązanie. Może znajdzie się na forum osoba, która podsunie coś lepszego? Poniżej zmodyfikowany kod middletu:
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Daty extends MIDlet implements CommandListener{
Command koniec;
private String fData(Date D)
{
String RRRR, MM, DD;
Calendar K = Calendar.getInstance();
K.setTime(D);
int rok = K.get(Calendar.YEAR);
int mies = K.get(Calendar.MONTH)+1;
int dzien = K.get(Calendar.DAY_OF_MONTH);
RRRR = "" + rok;
if (mies < 10)
{
MM = "0" + mies;
}
else
{
MM = "" + mies;
}
if (dzien < 10)
{
DD = "0" + dzien;
}
else
{
DD = "" + dzien;
}
return new String(DD + "." + MM + "." + RRRR);
}
public void startApp()
{
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;
Display dis;
Form fF;
dis = Display.getDisplay(this);
fF = new Form("Daty");
koniec=new Command("Koniec",Command.EXIT,0);
fF.addCommand(koniec);
//Date dzis;
Calendar tKal = Calendar.getInstance();
Date Dzis = new Date();
tKal.setTime(Dzis);
tKal.set(Calendar.HOUR_OF_DAY, 0);
tKal.set(Calendar.MINUTE, 0);
tKal.set(Calendar.SECOND, 0);
tKal.set(Calendar.MILLISECOND, 0);
Dzis = tKal.getTime();
StringItem s10=new StringItem(null, "Dzis= " + fData(Dzis));
fF.append(s10);
Spacer przerwa10=new Spacer(fF.getWidth(),1);
fF.append(przerwa10);
long ltKal = Dzis.getTime();
ltKal -= MILLIS_PER_DAY;
Calendar tKal2 = Calendar.getInstance();
tKal2.setTime(new Date(ltKal));
Date Wczoraj = new Date();
Wczoraj = tKal2.getTime();
StringItem s11=new StringItem(null, "Wczoraj= " + fData(Wczoraj));
fF.append(s11);
Spacer przerwa11=new Spacer(fF.getWidth(),1);
fF.append(przerwa11);
ltKal += 2L * MILLIS_PER_DAY;
Calendar tKal3 = Calendar.getInstance();
tKal3.setTime(new Date(ltKal));
Date Jutro = new Date();
Jutro = tKal3.getTime();
StringItem s12=new StringItem(null, "Jutro= " + fData(Jutro));
fF.append(s12);
Spacer przerwa12=new Spacer(fF.getWidth(),1);
fF.append(przerwa12);
StringItem s13=new StringItem(null, "A może tak:");
fF.append(s13);
Spacer przerwa13=new Spacer(fF.getWidth(),1);
fF.append(przerwa13);
StringItem s0=new StringItem(null, "Dzis= " + fData(Dzis));
fF.append(s0);
Spacer przerwa0=new Spacer(fF.getWidth(),1);
fF.append(przerwa0);
StringItem s1=new StringItem(null, "Wczoraj= " + fData(Wczoraj));
fF.append(s1);
Spacer przerwa1=new Spacer(fF.getWidth(),1);
fF.append(przerwa1);
StringItem s2=new StringItem(null, "Jutro= " + fData(Jutro));
fF.append(s2);
fF.setCommandListener(this);
dis.setCurrent(fF);
}
public void pauseApp(){}
public void destroyApp(boolean b){}
public void commandAction(Command c,Displayable d)
{
notifyDestroyed();
}
}