【问题标题】:Messaging: If there is not connection, send message when recover it消息:如果没有连接,恢复时发送消息
【发布时间】:2014-06-05 00:20:01
【问题描述】:

我创建了一个适用于 Android 的即时消息应用程序。但现在我想添加一些功能:

如果用户在尝试发送消息时没有互联网连接,则必须在用户恢复连接时发送。

我想最好的方法是使用广播接收器。但我不确定。

【问题讨论】:

    标签: android connection broadcastreceiver google-cloud-messaging messaging


    【解决方案1】:

    编辑:一旦连接失败,您可以跟踪所有失败的请求,并设置一个在后台运行的线程来尝试发送失败的消息。假设每 10-20 秒或更长时间。如果失败,线程将进入睡眠状态。发送完所有消息后,您将关闭线程,并且仅当消息失败时才会启动新线程。如果另一条消息失败,请检查他的队列。您还可以使用 PriorityQueue 以更简单的方式安排消息

    你可以像这样获取网络状态。

     public boolean getInternetState() {
    
       ConnectivityManager conMgr =  (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
    
        if (activeNetwork != null && activeNetwork.isConnected()) {
            return true;
        } else {
            DialogFragment noInternet = new NoInternetDialog();
            noInternet.show(getFragmentManager(), "noInternet");
            return false;
        }
    }
    

    您可以向用户显示一个 DialogFragment,这会将他带到 wifi 设置或您想要的任何地方。

    public class NoInternetDialog extends DialogFragment {
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("No Internet Connection! Please Check your Internet Connection and try Again!")
                .setPositiveButton("Open Wi-fi Settings", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // User cancelled the dialog
                    }
                });
        // Create the AlertDialog object and return it
        return builder.create();
    }
    

    }

    if(getInternetState()) {
          // do network request here
    }
    

    【讨论】:

    • 我不想向用户显示 wifi 设置。我想将消息保存在某处(例如 SQLite),并在用户恢复连接时尝试再次发送。
    • 你的后台线程解决方案不是资源消耗方式吗?
    • 取决于您发送请求的频率。每 20 秒左右检查一次用户是否有连接并发送请求。如果他没有互联网,您将线程再休眠 20 秒。请求完成后,您可以终止线程。考虑到手机现在拥有的所有处理能力,我认为这不会很消耗。
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多