2009-08-28 2 views
2

나는 정적 변수를 가지고있는 미들 릿을 가지고있다. 이 변수에 생성 된 모든 인스턴스의 기록을 유지해야합니다. 정적 변수처럼 작동하지 않습니다. 내 코드 세그먼트는 다음과 같습니다. Sun 무선 툴킷 2.5.5에서이 midlet을 실행하고 있습니다. 내가 그 툴킷에서 같은 미들 릿의 많은 개체를 만들 수 있지만 여전히 내 카운터를 1Midlet은 정적 변수를 어떻게 호출 할 수 있습니까?

public class SMS extends MIDlet implements CommandListener { 

    private Display display; 
    private TextField userID, password ; 
    public static int counter ; 

    public SMS() { 

     userID = new TextField("LoginID:", "", 10, TextField.ANY); 
     password = new TextField("Password:", "", 10, TextField.PASSWORD); 
     counter++; 

    } 

public void startApp() { 

     display = Display.getDisplay(this); 
     loginForm.append(userID); 
     loginForm.append(password); 
     loginForm.addCommand(cancel); 
     loginForm.addCommand(login); 
     loginForm.setCommandListener(this); 
     display.setCurrent(loginForm); 

    public void commandAction(Command c, Displayable d) { 

    String label = c.getLabel(); 
    System.out.println("Total Instances"+counter); 

마다 표시, 카운터 만든 단 1 개체를 보여줍니다.

답변

1

MIDlet은 한 번만 인스턴스화됩니다. 거의.

MIDP 런타임은 이미 실행중인 MIDlet을 두 번 실행하는 것을 허용하지 않습니다.

MIDlet을 종료하면 카운터는 여전히 RAM 내 값이고 Java Virtual Machine 프로세스가 종료되므로 0으로 되돌아갑니다.

일부 Nokia series40 전화기에서는 JVM 프로세스가 종료되지 않으므로이 기능을 사용하여 전화기를 마지막으로 켜고 나서 MIDlet을 만든 횟수를 표시 할 수 있습니다.

정적 변수는 JVM 메모리의 Class 객체에 저장됩니다. 당신은 정적 변수에 저장할 수있는 것을 알아 내기 위해 클래스 로딩 (그리고 J2ME에서의 클래스 언 로딩에 대한 지원 부족)을 이해해야합니다.

counter++;startApp()으로 옮기는 것이 좋습니다. MIDlet을 포 그라운드로 가져올 때마다 호출 할 수 있기 때문입니다.

이렇게하면 추가 정확도를 위해 카운터를 RMS 레코드에 저장할 수 있습니다.

1

응용 프로그램의 '호출'사이에 정적 변수를 유지할 수있는 유일한 시스템은 Android입니다. MIDlet 호출간에 정적 데이터를 유지 관리하는 J2ME 장치를 본 적이 한번도 없습니다. 그러나 MIDlet Suite 내의 MIDlet은 here과 같이 정적 데이터를 공유 할 수 있지만 적어도 하나는 실행 중입니다.

MIDlet 호출간에 데이터를 유지하려면 영구 저장소에 대한 액세스를 제공하는 javax.microedition.rms의 레코드 저장소 API를 사용해야합니다.

관련 문제