2011-07-15 87 views
0

我設置了一個程序,其中一個活動(一個菜單)調用另一個菜單。然後這個菜單可以調用各自啓動不同GamePanel /線程的各種活動。在返回到菜單後按下箭頭返回按鈕,但是它們已經崩潰並且不能再使用。在surfaceview/thread崩潰後返回活動:s

第二點,在代碼的第一部分,我不能在偵聽器中設置意圖,因爲eclipse要求Intent參數是空的,因此我創建了按下的方法,任何解釋/解決方案?在此先感謝所有人!

從菜單中調用:

private OnClickListener L1Listen = new OnClickListener(){ 

public void onClick(View arg0) { 
    L1Pressed(); 
} 

}; 

public void L1Pressed() 
{ 
Intent intent = new Intent(this, L1Started.class); 
startActivity(intent); 

} 

從菜單中調用:

package SortItOut.sortitout; 

import android.app.Activity; 
import android.os.Bundle; 

public class L1Started extends Activity{ 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MainGamePanelL1((this))); 
} 




protected void onDestroy() 
{ 
super.onDestroy(); 
} 

protected void onStop() 
{ 
super.onStop();  
} 

} 

面板的構造函數(實現SurfaceHolder.callback)

public MainGamePanelL1(Context context){ 
    super(context); 
    getHolder().addCallback(this); 

    thread = new MainThreadL1(getHolder(), this); 
    setFocusable(true); 

主題

package SortItOut.sortitout; 


import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class MainThreadL1 extends Thread { 

private boolean running; 
private SurfaceHolder surfaceholder; 
private MainGamePanelL1 gamepanel; 
int y; 


public void setRunning(boolean running) 
{ 
    this.running = running; 
} 

public MainThreadL1(SurfaceHolder surfaceholder, MainGamePanelL1 mainGamePanelL1) 
{ 
this.surfaceholder = surfaceholder; 
this.gamepanel = mainGamePanelL1; 
} 


public void run() 
{ 
    Canvas canvas; 
    while(running) 
    { 
     canvas = null; 
     try{ 
     canvas = this.surfaceholder.lockCanvas(); 
     synchronized(surfaceholder) 
     { 
      gamepanel.Check(); 
      this.gamepanel.onDraw(canvas); 

     } 

     }finally 
     { 

      if(canvas != null) 
      { 
       surfaceholder.unlockCanvasAndPost(canvas); 
      } 
     } 

    } 
} 




} 

回答

0

您的崩潰正在發生,因爲您正在執行來自後臺線程的顯示操作,例如onDraw()。你的表面和視圖上的所有操作都必須從主UI線程完成。

這意味着您必須提供某種機制,以便您的後臺線程可以告訴主線程何時以及如何繪製。一種方法是使用Android Handler類,該類旨在允許您在線程之間進行通信。例如,您可以使用HandlerRunnable對象發送給主UI線程,然後將其與其他異步事件一起執行。

另一種方法是使用Android ASyncTask類,它包裝了一個後臺任務並提供了可以覆蓋的方法onProgressUpdate()onPostExecute()。這兩個方法總是在主UI線程上調用。

編輯:有兩個方法可以強制UI更新發生在主線程:

1)行業有一個API調用runOnUiThread(),你可以從後臺線程調用。傳遞到它的可運行將在主線程中調用:

BillingActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     BillingActivity.this.finish(); 
    } 
}); 

2)查看有post()方法同樣將排隊一個Runnable將在不久的將來在UI線程上運行:

mView.post(new Runnable() { 
    public void run() { 
     mView.doSomethingOrOther(); 
    } 
}); 

無論你怎麼做,所有的視圖操作必須在主線程上完成。

+0

那麼,只要將onDraw等移動到線程中就更容易了? –

+0

必須從主線程調用所有與UI相關的活動。 – mportuesisf

+0

這是實際的代碼還是呼叫?什麼是與UI相關的活動? –