我寫了一個遊戲(我給它取名爲「玩家」),其中我有以下的一般結構(代碼已經大大簡化):android應用程序的主線程在哪裏?
public class Gamer extends Activity implements View.OnClickListener
{
public void onCreate(Bundle savedInstanceState)
{
mpt = new MicksPanelThing(this);
}
}
public class MicksPanelThing extends SurfaceView implements SurfaceHolder.Callback
{
public MicksPanelThing(Context context)
{
super(context);
micks_thread_thing = new MicksThreadThing(getHolder(), this);
getHolder().addCallback(this);
setFocusable(true);
}
void updateView()
{
final SurfaceHolder holder = getHolder();
try
{
Canvas canvas = holder.lockCanvas();
if(canvas != null)
{
onDraw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void onDraw(Canvas canvas)
{
// blah
}
}
class MicksThreadThing extends Thread
{
public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt)
{
// blah
}
public void run()
{
while (this_thread_is_currently_active)
{
micks_panel_thing.updateView();
}
}
}
本場比賽是所有工作的罰款和非常健壯。現在我想測試一個特定的條件,如果它是真的,則建立一個AlertDialog。我推測我可以把這段代碼放在我的onDraw方法中。然後我得到一條消息:「不能在線程內創建沒有調用Looper.prepare()的處理程序」 - 這讓我感到困惑,因爲我認爲onDraw方法正在被我認爲不需要的主線程執行設置任何東西。
我認爲我可以通過將我的測試和對話框移動到主線程(其中?)的某處或通過在某處添加一些Looper.prepare()代碼來解決此問題。
請有人告訴我哪個更容易 - 哪裏需要代碼。
這段代碼在哪裏? – Mick
你說你想從你的線程顯示你的對話框,所以你的線程無法觸及或修改UI,唯一可以做到這一點的線程是UIThread,所以強制你的線程修改UI(創建對話框,視圖,修改視圖...等等)你應該重寫方法runOnUIThread()來強制你的線程在UIThread中運行該代碼, – Houcine
或者你可以使用AsyncTask – Houcine