0

如果网络通信线程出现问题,我想向用户显示一条消息。

出于这个原因,有必要显示来自处理程序的对话框。

这是正确的方法吗?,因为我没有找到方法,如何在处理程序类中获取 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)

     }  

}
4

3 回答 3

1

过了一会儿,我找到了一个非常简单的解决方案:

您必须在 Service 类中实现此方法:

void alert(String message) 
{
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(getApplication());
    alertDialog.setMessage(message);
    alertDialog.setNeutralButton("OK", null);
    alertDialog.create().show();
}

有时它真的很容易:)

于 2013-02-08T09:29:57.940 回答
0

为什么不显示一条简单的 toast 消息,以字符串形式显示您收到的错误消息(或您想要设置的任何其他消息)

也许我误解了你的问题,但对我来说,这似乎是合乎逻辑的。我正在使用简单的 toast 来显示网络错误消息或其他内容。

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 等。

于 2013-01-28T14:07:20.960 回答
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();
}

就是这样。

不幸的是,我不能在我的情况下使用它,因为这仅在您只有一个活动(在本例中为 MainActivity)时才有效。因为 Dialog 只会出现在这个 Activity 中。

在我的项目中,我有更多的活动,所以使用它没有任何意义。

我决定显示一条简短的 toast 消息,例如“网络错误”,并在 OptionsMenu 中提供帮助页面。

感谢米洛斯!我希望这段代码有时对某人有所帮助:)

于 2013-01-29T09:21:12.773 回答