2011-07-15 3 views
0

1つのアクティビティ(メニュー)が別のメニューを呼び出すプログラムをセットアップしました。このメニューでは、別のGamePanel /スレッドを開始するさまざまなアクティビティを呼び出すことができます。この後、矢印の戻るボタンを押すとメニューに戻りますが、クラッシュして使用できなくなります。surfaceview/threadがクラッシュした後のアクティビティに戻る:s

eclipseがインテントパラメータを空にする必要があるため、コードの最初のセクションでは、リスナーにインテントを設定できません。そのため、押されたメソッド、説明/解像度を作成しますか?すべてに事前に感謝!

メニューから呼び出す:

メニューから呼び出さ
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スレッドから行う必要があります。

これは、バックグラウンドスレッドがメインスレッドにいつ、何を描画するかを伝えるために、ある種のメカニズムを提供する必要があることを意味します。これを行う1つの方法は、スレッド間で通信できるように設計されたAndroid Handlerクラスです。たとえば、Handlerを使用してRunnableオブジェクトをメインのUIスレッドに送信し、それを他の非同期イベントと共に実行することができます。

もう1つの方法は、バックグラウンドタスクをラップし、オーバーライドできるonProgressUpdate()onPostExecute()のメソッドを提供するAndroid ASyncTaskクラスを使用することです。両方のメソッドは、常にメインのUIスレッドで呼び出されます。

EDIT:あなたは、メインスレッド上で発生するUIの更新を強制することができ、さらに2つの方法があります。

1)活動あなたがバックグラウンドスレッドから呼び出すことができるAPI呼び出しrunOnUiThread()を持っています。あなたはそれに渡すのRunnableは、メインスレッドで呼び出されます:

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

2)ビューも同様に、近い将来にUIスレッド上で実行されるのRunnableをキューに入れますpost()方法があります。

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

どのように行うにしても、すべてのビューの操作はメインスレッドで行う必要があります。

+0

スレッドにonDrawなどを移動するだけで簡単にできますか? –

+0

すべてのUI関連アクティビティは、メインスレッドから呼び出さなければなりません。 – mportuesisf

+0

これは実際のコードか呼び出しですか? UI関連のアクティビティとは何でしょうか? –

関連する問題