我使用OKHttp:https://github.com/square/okhttp/wiki/Recipes库为我的Android应用程序做了一些请求,我正在使用库来显示对话框: https://github.com/afollestad/material-dialogs
这是解释我的问题的简化代码:
mLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
post(SERVER_ADDRESS + "/login", userEmail, userPassword, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String responseUserConnected = response.body().string();
if (/*user not find error*/) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Helper.loginError(LoginActivity.this); // CRASH HERE
mLoginButton.setEnabled(true);
mSignUpButton.setEnabled(true);
}
}
}
}
}
});
} catch (IOException mE) {
mE.printStackTrace();
}
}
});
这是我的DialogBox方法的代码:
public static void loginError(Context context){
new AlertDialogWrapper.Builder(context)
.setCancelable(false)
.setTitle(R.string.login_error_title)
.setMessage(R.string.login_error_message)
.setPositiveButton(R.string.login_error_ok_button_text, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
这一般工作正常但我发现当我暂停当前活动时它是LoginActivity,或者如果我在请求期间打开其他应用程序,当应用程序想要显示对话框时,应用程序停止并崩溃,我假设这是因为它找不到当前活动来创建我的DialogBox。 我有这个错误:
致命异常: android.view.ViewRootImpl $ CalledFromWrongThreadException:只有 创建视图层次结构的原始线程可以触及其视图。
我尝试使用getApplication()
,getApplicationContext()
,getBaseContext()
方法,但它向我展示了这条消息:
致命异常: com.afollestad.materialdialogs.MaterialDialog $ DialogException:错误 窗口令牌,您无法在创建活动之前显示对话框 或隐藏后。
如何预防或解决这些崩溃?
答案 0 :(得分:1)
当活动不在前台时,您无法显示正常的AlertDialog /对话框。但是you can consider to use an activity whose theme is set to that of a dialog有一个选项。它将作为对话框使用,并具有与Activity相同的生命周期属性。
您无法使用getApplication()
,getApplicationContext()
或getBaseContext()
创建对话框,因为对话框归Activity
所有。所以你应该使用Activity.this