我在寫遊戲。當用戶結束等級時,會發生以下情況:在當前活動中顯示對話框
- 發送POST以檢查級別記錄是否被毆打。 (1-5秒)
- 如果是這樣,請輸入
Dialog
「輸入你的名字」。 (快) - 當用戶點擊確定時,發送POST與他的記錄。 (1-5秒)
當用戶結束級別時,他在GameActivity
。 checkWorldRecord()
被調用,並在其中,一個AsyncTask
啓動:
private void checkWorldRecord(final RecordType recordType, final double time, final int level)
{
new Handler(Looper.getMainLooper()).post(new Runnable()
{
@Override
public void run()
{
new DownloadTask(recordType, time, level).execute();
}
});
}
DownloadTask
正在做這三件事情,這是我在上市之初:
class DownloadTask extends AsyncTask<Void, Void, Void>
{
RecordType recordType;
double time;
int level;
public DownloadTask(RecordType recordType, double time, int level)
{
super();
this.recordType = recordType;
this.time = time;
this.level = level;
}
@Override
protected Void doInBackground(Void... params)
{
try
{
if (!Network.isWorldRecord(recordType, time, level)) // 1.
{
return null;
}
}
catch (Exception e)
{
return null;
}
Dialogs.showEnterNameAndSend(GameActivity.this, recordType, time, level, highScores.getGamesPlayed(),
highScores.getStars()); // 2.
return null;
}
}
一切都很好,當用戶後,等待這場比賽,如果他留在GameActivity
。
的問題是,當:
- 用戶結束了比賽。調用
checkWorldRecord()
。 - 在單獨的線程中,1st POST開始。
- 用戶按下後退按鈕並將活動更改爲另一個,至
MainActivity
。 AsyncTask
完成檢查,我們有新的記錄。showEnterNameAndSend()
想先建立並稍後顯示AlertDialog
。繁榮。因爲我們經過GameActivity
,現在MainActivity
是在頂部:
public static void showEnterNameAndSend(final Activity activity, final RecordType recordType, final double time,
final int level, final long gamesPlayed, final int stars)
{
AlertDialog.Builder builder = new AlertDialog.Builder(activity); // BOOM!!!
final EditText editText = new EditText(activity);
editText.setFilters(new InputFilter[]
{ new InputFilter.LengthFilter(Const.MAX_NAME_LENGTH) });
editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
builder.setView(editText);
builder.setTitle(recordType + " world record!");
builder.setMessage("Enter your name:");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int whichButton)
{
String username = editText.getText().toString();
if (username.equals(""))
{
return;
}
try
{
Network.sendRecord(recordType, username, time, level, gamesPlayed, stars); // 3.
}
catch (Exception e)
{
showInternetError(activity);
}
}
});
showDialogOnUiThread(activity, builder);
}
private static void showDialogOnUiThread(Activity activity, final AlertDialog.Builder builder)
{
activity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
builder.show();
}
});
}
是的,我也喜歡傳球Context
,而不是整個Activity
到showEnterNameAndSend()
。但是,showDialogOnUiThread()
(由showEnterNameAndSend()
調用)需要Activity
,以在UI線程上顯示Dialog
,其中activity.runOnUiThread()
。
如何修復?也許例如有一些方法getCurrentActivity()
,所以我不必通過一個Activity
,它可以已經隱藏?如果我可以以某種方式取消顯示對話框,用戶關閉GameActivity
後,它也會很好。
但我需要在UI線程上運行builder.show()。爲此,我必須使用runOnUiThread(),這是Activity的一種方法,而不是Context。 –
我認爲在大多數情況下,情境並不重要。您應該能夠使用UI線程上的應用程序上下文和調用show來創建構建器。你嘗試過嗎? – toadzky
如果我刪除runOnUiThread()應用程序崩潰。那麼,我如何運行builder.show()而沒有引用Activity? –