學習J2ME,首先要了解MIDlet的生命周期。本文主要是深入了解一下MIDlet的生命周期。以上自己的個人心得,不對之處,希望大家多多指點。
public class Midlet extends MIDlet{
Display display = null;
MyCanvas can;
public Midelt(){
display = Display.getDisplay(this);
can = new MyCanvas();
}
public void startApp(){
display.setCurrent(can);//如果把can = new MyCanvas()放到這裡,再來電返回時就會出問題。
}
}
或者
public class Midlet extends MIDlet{
Display display = null;
MyCanvas can;
public Midelt(){
}
public void startApp(){
if(display ==null){
display = Display.getDisplay(this);
can = new MyCanvas();
}//此處只會被運行1次,這樣就不會出錯
display.setCurrent(can);//這句按理放到這裡最合適,你想顯示那個canvas就放哪個!
}
}
在startApp()中,你調用display.setCurrent(can)的時候,首先運行的是showNotify(),接著運行paint()函數一次,如果有線程的話,此時run()方法開始運行。一般在run()方法裡一般這麼寫。此時的run()是可以處理異步事件的,也就是你來電話的時候,這裡run()還是運行的。不過他不會paint()什麼東西,即使它裡面有repaint(),這點放心。
public void run(){
while(flag){//flag是boolean型變量
try{
Thread.sleep(50);//時間自己設啦。
}catch(Exception e){}
repaint();
}
}
哇~~來電話了,或者你退到系統菜單。如nokia s60的手機。
hideNotify()首先會被調用,接著pauseApp()再被調用。
這麼快,打完了,返回時:先調用showNotify(),接著調用paint()函數一次,最後才是調用startApp()函數。
關於run()和paint()也可以使用display.callSerially(this)語句。這個以後有時間了再說。
明白了生命周期,再來看死機問題。我說的死機問題,多是來電話返回時死機。其實只要找到了問題,一切就變的很簡單。
為什麼死機,歸根結底還是程序問題。好像是廢話。哈~~
Graphics mg;//定義的全局參數
paint(Graphics g){
mg = g;//有的程序這樣寫,if(mg ==null){mg =g:}這樣對於n7610系列就會出錯。
mg.drawString();
switch(case){
case GAME_MUNE:
drawA();
break;
case PLAY:
drawB();
break;
default:
break;
}
}
/*下面的畫圖函數一定要放到paint()函數裡調用,不要在別的地方調用,如run()裡面,上面說過,程序暫停之後返回,會先paint()一次,如果在別的地方調用就會出現問題。*/
public void drawA(){
mg.drawString();
}
public void drawB(){
mg.drawString();
}
按照上面的寫法一般不會出現死機問題。當然,你也可以不定義全局的mg,可以把g單獨傳到各個畫圖子函數中。如,
paint(Graphics g){
g.drawString();
switch(case){
case GAME_MUNE:
drawA(g);
break;
case PLAY:
drawB(g);
break;
default:
break;
}
}
public void drawA(Graphics mg){
mg.drawString();
}
public void drawB(Graphics mg){
mg.drawString();
}