如果网络通信线程出现问题,我想向用户显示一条消息。
出于这个原因,有必要从处理程序中显示一个对话框。
这是正确的方法吗?因为我找不到办法,如何在处理程序类中获取FragmentManager。
class ErrorMessageHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
AlertDialogFragment dialog = new AlertDialogFragment((String) msg.getData().get("MESSAGE"));
dialog.show(FragmentManager, TAG)
}
}
答案 0 :(得分:1)
过了一会儿,我发现了一个非常简单的解决方案:
您必须在Service类中实现此方法:
void alert(String message)
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getApplication());
alertDialog.setMessage(message);
alertDialog.setNeutralButton("OK", null);
alertDialog.create().show();
}
有时它真的很容易:)
答案 1 :(得分:0)
为什么不显示一个简单的toast消息,作为字符串,你得到的错误信息(或你想设置的任何其他消息)
也许我误解了你的问题,但对我来说,这似乎是合乎逻辑的。我使用简单的toast来显示网络错误消息或whatewer。
Toast.makeText(context, text, duration).show();
根据你的评论,可以建议另一个解决方案:
出错时,显示确认对话框(AlertDialog),并让用户可以选择是否要阅读帮助:
new AlertDialog.Builder(this)
.setTitle("Network Error")
.setMessage(An error occured, would you like to read the help section ...)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Open here the new view with the help message etc.
}
})
.setNegativeButton(R.string.no, null)
.show();
因此,在这种情况下,您不会立即打扰长帮助文本的用户。您首先会告诉他产生了错误,如果他想阅读有关如何解决问题的帮助,他可以确认并进一步。这可能对您的应用程序的设计有利,因为通常用户不喜欢阅读大量文本,特别是没有一些帮助说明。
最后,您可以显示Alertdialog并显示一条简短的错误消息,并建议您查看帮助。在那里,你可以邀请他检查他的互联网连接是否已启用,解释如何启用,建议一个按钮直接进入手机页面,他可以启用/禁用wifi等。
答案 2 :(得分:0)
所以...我已经找到了解决这个问题的方法,但这不是完美的方式(更多细节在这个答案的底部)。
首先创建一个Messenger:
private Messenger AlertDialogMessenger = new Messenger(new AlertDialogMessageHandler());
第二个处理程序,显示此对话框:
class AlertDialogMessageHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create();
dialog.setTitle("Attention");
dialog.setMessage((CharSequence) msg.getData().get("MESSAGE"));
dialog.setOnCancelListener(new DialogInterface.OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
//Do something
}
});
dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//Do something
dialog.dismiss();
}
});
dialog.show();
}
}
然后你只需要发送信使去服务:
Intent intent = new Intent(this,MyService.class);
intent.putExtra(MainActivity.EXTRA_FROM_SERVICE_MESSENGER, this.AlertDialogMessenger);
this.bindService(intent, this.conn, Context.BIND_AUTO_CREATE);
在服务中你必须抓住信使:
@Override
public IBinder onBind(Intent intent)
{
this.AlertDialoMessenger = intent.getParcelableExtra(MainActivity.EXTRA_FROM_SERVICE_MESSENGER);
return null;
}
然后您可以通过发送消息来显示对话框:
Message msg = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("MESSAGE", "This is a test message");
msg.setData(bundle);
try
{
AlertDialoMessenger.send(msg);
}
catch (RemoteException e1)
{
e1.printStackTrace();
}
就是这样。
不幸的是我不能在我的情况下使用它,因为只有一个Activity(在这种情况下是MainActivity),这只能工作。 因为对话框只会出现在此活动中。
在我的项目中,我有更多的活动,因此使用它是没有意义的。
我决定出现像“网络错误”这样的简短敬酒消息,并在OptionsMenu中提供帮助页面。
感谢米洛斯!和 我希望这段代码有时可以帮助某人:)