IllegalStateException BlackBerry

2019-09-08 07:11发布

问题:

public class show extends MainScreen {
    private String date1;
    private long date1l;
    private long date2l;
    private LabelField curDate = new LabelField();
    private LabelField toDate = new LabelField();
    private LabelField diffe = new LabelField();
    // private LabelField info;
    // private LabelField empty;
    // private InvokeBrowserHyperlinkField hello;

    ButtonField activate = null;
    ButtonField disactivate = null;
    Timer timer;
    Timer timer2;

    public String date1s[];
    int d, m, y;
    int x = 1;
    String day, hour, minute;
    Date date = new Date();

    Calendar calendar = Calendar.getInstance();;
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM yyyy HH mm");

    public show() {
        add(curDate);
        add(toDate);
        add(new SeparatorField());
        add(diffe);

        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTick(), 0, 1000);
    }

    private class TimerTick extends TimerTask {
        public void run() {
            if (x != 0) {
                date1l = date.getTime();

                try {
                    date1 = dateFormat.format(calendar.getTime());
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Calendar cal = Calendar.getInstance();
                cal.setTimeZone(TimeZone.getTimeZone("GMT+7:00"));
                cal.set(Calendar.HOUR_OF_DAY, 0);
                cal.set(Calendar.MINUTE, 0);
                cal.set(Calendar.MONTH, 1);
                cal.set(Calendar.DATE, 1);
                cal.set(Calendar.YEAR, 2012);

                date2l = cal.getTime().getTime();

                date1s = StringUtilities.stringToWords(date1);
                d = Integer.parseInt(date1s[0]);
                m = Integer.parseInt(date1s[1]);
                y = Integer.parseInt(date1s[2]);
                display();
            } else {
                timer.cancel();
            }
        }
    }

    public void display() {
        String monw = convertToWords(m);
        curDate.setText("Current Date = " + d + " " + monw + " " + y + " "
                + date1s[3] + ":" + date1s[4]);
        toDate.setText("To Date = 1 February 2012 00:00");

        long diffms = date2l - date1l;
        long ds = diffms / 1000;
        long dm = ds / 60;
        long dh = dm / 60;
        long dd = dh / 24;

        long q = dd;
        long h = (ds - (dd * 24 * 60 * 60)) / (60 * 60);
        long m = (ds - (dh * 60 * 60)) / 60;

        diffe.setText("Remaining Time : \n" + Long.toString(q) + " day(s) "
                + Long.toString(h) + " hour(s) " + Long.toString(m)
                + " minute(s)");

        day = Long.toString(q);
        hour = Long.toString(h);
        minute = Long.toString(m);

        showMessage();
    }

    /*
     * private void link() { empty = new LabelField("\n\n"); add(empty); hello =
     * new InvokeBrowserHyperlinkField("Click here",
     * "http://indri.dedicated-it.com/wordpress/?page_id=17"); add(hello); info
     * = new LabelField("\n\nPress menu then choose \"Get Link\" to access");
     * add(info); }
     */

    void showMessage() {
        activate = new ButtonField("Activate", FIELD_HCENTER) {
            protected boolean navigationClick(int action, int time) {
                if (activate.isFocus()) {
                    Dialog.alert("Started!!");
                    Start();
                }
                return true;
            }
        };
        add(activate);

        disactivate = new ButtonField("Disactivate", FIELD_HCENTER) {
            protected boolean navigationClick(int action, int time) {
                if (disactivate.isFocus()) {
                    Dialog.alert("Stopped!!");
                    timer2.cancel();
                }
                return true;
            }
        };
        add(disactivate);

        /*
         * UiEngine ui = Ui.getUiEngine(); Screen screen = new
         * Dialog(Dialog.D_OK, data, Dialog.OK,
         * Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION),
         * Manager.VERTICAL_SCROLL); ui.queueStatus(screen, 1, true);
         */
    }

    public void Start() {
        timer2 = new Timer();

        timer2.scheduleAtFixedRate(new TimerTick2(), 0, 6000);
    }

    private class TimerTick2 extends TimerTask {

        public void run() {

            UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    synchronized (Application.getEventLock()) {
                        UiEngine ui = Ui.getUiEngine();
                        Screen screen = new Dialog(Dialog.D_OK, "Hello!",
                                Dialog.OK,
                                Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION),
                                Manager.VERTICAL_SCROLL);
                        ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL_QUEUE);
                    }
                }

            });

        }
    }

    private String convertToWords(int m) {
        String w = "";
        switch (m) {
        case 1:
            w = "January";
            break;
        case 2:
            w = "February";
            break;
        case 3:
            w = "March";
            break;
        case 4:
            w = "April";
            break;
        case 5:
            w = "May";
            break;
        case 6:
            w = "June";
            break;
        case 7:
            w = "July";
            break;
        case 8:
            w = "August";
            break;
        case 9:
            w = "September";
            break;
        case 10:
            w = "October";
            break;
        case 11:
            w = "November";
            break;
        case 12:
            w = "December";
            break;
        }
        return w;
    }

    public boolean onClose() {
        UiApplication.getUiApplication().requestBackground();
        return true;
    }
}

What actually is JVM 104 IllegalStateException? This program is a countdown program, which counts the remaining time from today until February 1st. Also, I implement a timer function that appears even if the application is closed. Can u please help me locate the problem? Thank you

回答1:

As Richard said, you are trying to update LabelField from another thread. Try the following code snippet:

synchronized (UiApplication.getEventLock()) {
    labelField.setText();
}


回答2:

Try this below code and change according to your requirement;

public class FirstScreen extends MainScreen implements FieldChangeListener
{   
LabelField label;
Timer timer;
TimerTask timerTask;
int secs=0;
long start,end;
String startDate="2012-01-28",endDate="2012-01-29"; 
ButtonField startCountDown;
public FirstScreen() 
{
    createGUI();        
}

private void createGUI() 
{       
    startCountDown=new ButtonField("Start");
    startCountDown.setChangeListener(this);
    add(startCountDown);
}

public void fieldChanged(Field field, int context) 
{
    if(field==startCountDown)
    {
        start=System.currentTimeMillis();
         //this is the current time milliseconds; if you want to use two different dates
        //except current date then put the comment for "start=System.currentTimeMillis();" and 
       //remove comments for the below two lines;
       //Date date=new Date(HttpDateParser.parse(startDate));
       //start=date.getTime();

        Date date=new Date(HttpDateParser.parse(endDate));
        end=date.getTime();
        int difference=(int)(end-start);
        difference=difference/1000;//Now converted to seconds;
        secs=difference;
        Status.show("Seconds: "+secs,100);
        callTheTimer();         
    }
}

public void callTheTimer()
{   
    label=new LabelField();
    add(label);
    timer=new Timer();
    timerTask=new TimerTask() 
    {
        public void run() 
        {
            synchronized (UiApplication.getEventLock()) 
            {
                if(secs!=0)
                {
                    label.setText(""+(secs--)+" secs");                 
                }
                else
                {   
                    timer.cancel();                     
                    UiApplication.getUiApplication().invokeLater(new Runnable() 
                    {
                        public void run() 
                        {
                            label.setText("");
                            Dialog.alert("Times Up");                                                              
                        }           
                    });                     
                }
            }
        }
    };
    timer.schedule(timerTask, 0, 1000);
}
protected boolean onSavePrompt() 
{
    return true;
}
public boolean onMenu(int instance) 
{
    return true;
}
public boolean onClose() 
{
    UiApplication.getUiApplication().requestBackground();
    return super.onClose();
}
}

In this code I am taking taking two different dates and start the countdown by taking their difference(in seconds); See the comments in the code;