【问题标题】:Firebase: onDisconnect() in a serviceFirebase:服务中的 onDisconnect()
【发布时间】:2019-02-21 11:42:02
【问题描述】:

我正在做一个我必须做的项目

配置实时互联网连接状态

一个客户端应用程序,即使应用程序在后台。

我必须显示它

天气特定设备连接到互联网的服务器端或 不是

我正在使用 Firebase 执行此场景,但它不起作用。

连接服务

public class ConnectionService extends Service implements ConnectivityReciever.ConnectivityRecieverListner {

    public static final int notify = 5000;
    private Handler mHandler=new Handler();
    private Timer mTimer = null;
    FirebaseDatabase db;
    DatabaseReference dbRef;


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        dbRef=FirebaseDatabase.getInstance().getReference(Common.DEVICE_NAME).child("online");
        MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
        boolean isConnected=ConnectivityReciever.isConnected();
        checkConnection(isConnected);

        if(mTimer!=null){
            mTimer.cancel();
        }else{
            mTimer=new Timer();
            mTimer.scheduleAtFixedRate(new TimeDisplay(),0,notify);
        }
    }

    private void checkConnection(boolean isConnected) {

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(ConnectionService.this, "Service is destroyed", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        if(isConnected){
            dbRef.onDisconnect().setValue("true");
            Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();

        }
        if(!isConnected){

            dbRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

            Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();

        }
    }

    //class TimeDisplay for handling task
    class TimeDisplay extends TimerTask {
        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
                    boolean isConnected=ConnectivityReciever.isConnected();
                    checkConnection(isConnected);
                    // display toast
                    Toast.makeText(ConnectionService.this, "Service is running", Toast.LENGTH_SHORT).show();
                }
            });

        }

        private void checkConnection(boolean isConnected) {
            if(isConnected){
                dbRef.setValue("true");
                Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();
            }
            if(!isConnected){

                dbRef.child("online").onDisconnect().setValue(ServerValue.TIMESTAMP);
                Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();
            }
        }

    }


}

应用

public class MyApplication extends Application {
    public static MyApplication mInstance;

    DatabaseReference dbRef;
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance=this;
        Common.DEVICE_NAME = android.os.Build.MODEL;
        FirebaseApp.initializeApp(this);

        FirebaseDatabase.getInstance().setPersistenceEnabled(true);



    }

    public static synchronized MyApplication getInstance(){
        return mInstance;
    }

    public void setConnectivtyListner(ConnectivityReciever.ConnectivityRecieverListner listner){
        ConnectivityReciever.connectivityReceiverListener = listner;
    }
}

我已经尝试了所有方法,但没有任何效果。

我们将获得帮助。

谢谢

【问题讨论】:

  • 什么不起作用?你有错误吗?
  • 当没有互联网连接时,onDisconnet 不会将时间戳值保存到 firebase 数据库
  • 这是错误
  • post查看 Frank van Puffelen 的回答。
  • @AlexMamo 感谢分享。但问题是 onDisconnect() 在互联网连接时没有启动。并且没有实时保存时间戳的值?

标签: android firebase firebase-realtime-database service internet-connection


【解决方案1】:

如果您已使用 menifest.xml 注册您的服务并返回 start_sticky,它应该可以工作,但还有另一种方法,您可以编写一个 api 来 ping 服务器(在特定时间间隔后在服务中调用它),并且用 TRUE 保存 时间戳(如果 isConnected),所以现在时间戳与布尔值 true 一起保存,假设现在连接关闭或单元已死,因为不会向服务器发送更新, 正确的? 现在它来了接收器/管理应用程序的魔力(您想以图形方式显示此在线状态),现在编写另一个 API,它将获取带有时间戳的已保存响应并获取触发此获取 API 的当前时间,找到这两个时间戳的黑白差异&在这里施加一个条件` (这里的差异以秒为单位,因为我们使用的是时间戳)

if(timeDifference>60)`
{
echo "true";
}
else 
echo "false";

通过这种方式,您可以获得实时在线/离线状态 在你可以设置的接收器应用程序上

if(response.equals("true"))
{
textView.setText("ONLINE")
}
else
{
textView.setText("OFFLINE")
}

您还可以阅读此帖子的答案 Save Response to Server When Network Connection goes OFF

【讨论】:

    【解决方案2】:

    您是否在 Manifest.xml 中注册了您的服务? 为了让您的服务具有“粘性”,您应该覆盖您的 onStartCommand 以返回 START_STICKY

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 2014-08-04
      • 2016-11-04
      • 2021-02-25
      • 1970-01-01
      • 2018-09-26
      • 2011-02-20
      • 2013-03-23
      相关资源
      最近更新 更多