Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器发送事件-如何在Android中处理_Java_Android_Server Sent Events - Fatal编程技术网

Java 服务器发送事件-如何在Android中处理

Java 服务器发送事件-如何在Android中处理,java,android,server-sent-events,Java,Android,Server Sent Events,我已经创建了一个应用程序(遵循当前使用LiveData和改进的Android MVVM架构)。该应用程序用作照明和进入系统的遥控器 我构建了一个Repository类,该类使用对RESTAPI进行调用的改装来实现网络后端。当我手动请求(使用GET)状态更新时,我可以获取IO的状态。但是,我需要为另一个URI上的相同数据使用服务器发送的事件来更新IO状态 改装似乎不支持此功能。我发现了其他似乎可以处理SSE的API,比如EventSource、EventSource Android、OkHttp

我已经创建了一个应用程序(遵循当前使用LiveData和改进的Android MVVM架构)。该应用程序用作照明和进入系统的遥控器

我构建了一个Repository类,该类使用对RESTAPI进行调用的改装来实现网络后端。当我手动请求(使用GET)状态更新时,我可以获取IO的状态。但是,我需要为另一个URI上的相同数据使用服务器发送的事件来更新IO状态

改装似乎不支持此功能。我发现了其他似乎可以处理SSE的API,比如EventSource、EventSource Android、OkHttp EventSource和OKSE。所有这些都只是EventSource的不同实现吗?它们在功能上有什么不同

我从阅读别人写的代码中学习;在哪里可以找到如何实现这些功能的示例?我的搜索结果没有提供任何有用的例子。是否有处理服务器发送事件的推荐最佳做法

我真的不想轮询我的服务器以获取更新,我很困惑为什么Android上几乎不支持SSE

以下是我迄今为止实现的一些类,仅供参考

数据模型:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name = "onboardGpio", strict = false)
public class OnboardGPIO
{
    @Element(name = "garageDoorFeedbackState")
    private String garageDoorState;

    @Element(name = "zoneOneState")
    private String zoneOneState;

    @Element(name = "zoneTwoState")
    private String zoneTwoState;

    @Element(name = "zoneThreeState")
    private String zoneThreeState;

    @Element(name = "systemArmedState")
    private String systemArmed;

    @Element(name = "panelTemperature")
    private String panelTemperature;

    @Element(name = "garageDoorRelayState")
    private String garageDoorRelayState;

    @Element(name = "zoneOneRelayState")
    private String zoneOneRelayState;

    @Element(name = "zoneTwoRelayState")
    private String zoneTwoRelayState;

    @Element(name = "zoneThreeRelayState")
    private String zoneThreeRelayState;

    ...getters & setters...
}
存储库类

import androidx.lifecycle.MutableLiveData;
import ca.thirdgear.homeautomation.http.HomeAutomationAPI;
import ca.thirdgear.homeautomation.http.HomeAutomationController;
import ca.thirdgear.homeautomation.model.OnboardGPIO;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class DataRepository
{
    private static DataRepository dataRepository;
    private HomeAutomationController homeAutomationController;
    private HomeAutomationAPI homeAutomationAPIService;
    private MutableLiveData<String> zoneOneState;
    private MutableLiveData<String> zoneTwoState;
    private MutableLiveData<String> garageDoorState;

    public static DataRepository getInstance()
    {
        if(dataRepository == null)
        {
            dataRepository = new DataRepository();
        }
        return dataRepository;
    }

    private DataRepository()
    {
        homeAutomationController = HomeAutomationController.getInstance();
        homeAutomationAPIService = homeAutomationController.createService(HomeAutomationAPI.class);
        zoneOneState = new MutableLiveData<>();
        zoneTwoState = new MutableLiveData<>();
        garageDoorState = new MutableLiveData<>();
    }

    //get status of remote API I/O
    public void getIoStatus()
    {
        Call<OnboardGPIO> call = homeAutomationAPIService.getIoStatus();
        call.enqueue(new Callback<OnboardGPIO>() {
            @Override
            public void onResponse(Call<OnboardGPIO> call, Response<OnboardGPIO> response)
            {
                if(response.isSuccessful())
                {
                    zoneOneState.setValue(response.body().getZoneOneState());
                    zoneTwoState.setValue(response.body().getZoneTwoState());
              garageDoorState.setValue(response.body().getGarageDoorState());
                }
            }

            @Override
            public void onFailure(Call<OnboardGPIO> call, Throwable t)
            {
                //TODO
            }
        });

        ... other network calls ...
}
导入androidx.lifecycle.MutableLiveData;
导入ca.thirdgear.homeautomation.http.HomeAutomationAPI;
导入ca.thirdgear.homeautomation.http.HomeAutomationController;
导入ca.thirdgear.homeautomation.model.OnboardGPIO;
2.电话;;
2.回拨;
2.回应;;
公共类数据存储库
{
私有静态数据存储库;
家用自动控制器家用自动控制器;
私人家庭自动化API家庭自动化PIS服务;
私有可变LiveData zoneOneState;
私有可变LiveData ZonetHoste;
私有可变LiveData garageDoorState;
公共静态数据存储库getInstance()
{
if(dataRepository==null)
{
dataRepository=新的dataRepository();
}
返回数据存储库;
}
专用数据存储库()
{
homeAutomationController=homeAutomationController.getInstance();
HomeAutomationApisService=homeAutomationController.createService(HomeAutomationAPI.class);
zoneOneState=新的可变LiveData();
ZonetHostate=新的可变LiveData();
garageDoorState=new MutableLiveData();
}
//获取远程API I/O的状态
公共无效getIoStatus()
{
Call Call=homeAutomationAPIService.getIoStatus();
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应)
{
if(response.issusccessful())
{
setValue(response.body().getZoneOneState());
setValue(response.body().getZonetHostate());
setValue(response.body().getGarageDoorState());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t)
{
//待办事项
}
});
…其他网络呼叫。。。
}
网络类

import okhttp3.Credentials;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import retrofit2.Retrofit;
import retrofit2.converter.simplexml.SimpleXmlConverterFactory;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

@SuppressWarnings("deprecation")
public class HomeAutomationController
{
    private static final String BASE_URL = "https://MY_URL/";
    private static HomeAutomationController homeAutomationController;
    private OkHttpClient okHttpClient;
    private Retrofit retrofit;

    public static HomeAutomationController getInstance()
    {
        if(homeAutomationController == null)
        {
            homeAutomationController = new HomeAutomationController();
        }
        return homeAutomationController;
    }

    private HomeAutomationController()
    {
        //create OkHttpClient
        okHttpClient = new OkHttpClient().newBuilder().addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();

            Request.Builder builder = originalRequest.newBuilder().header("Authorization",
                    Credentials.basic("USERNAME", "PASSWORD"));

            Request newRequest = builder.build();
            return chain.proceed(newRequest);
            }
        })
            .readTimeout(0, TimeUnit.SECONDS)
            .build();

        //create retrofit object
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .client(okHttpClient)
                .build();
    }

    //create and return http service
    public <S> S createService(Class <S> serviceClass)
    {
        return retrofit.create(serviceClass);
    }

}
导入okhttp3.凭证;
进口okhttp3.拦截器;
导入okhttp3.OkHttpClient;
导入okhttp3.请求;
进口改装2.改装;
导入2.converter.simplexml.SimpleXmlConverterFactory;
导入java.io.IOException;
导入java.util.concurrent.TimeUnit;
@抑制警告(“弃用”)
公共级家庭自动控制器
{
私有静态最终字符串BASE_URL=”https://MY_URL/";
专用静态HomeAutomationController HomeAutomationController;
私人OkHttpClient OkHttpClient;
私人改装;
公共静态HomeAutomationController getInstance()
{
如果(homeAutomationController==null)
{
homeAutomationController=新的homeAutomationController();
}
返回原点自动控制器;
}
私人家庭自动控制器()
{
//创建OkHttpClient
okHttpClient=新的okHttpClient().newBuilder().addInterceptor(新的拦截器(){
@凌驾
公共okhttp3.响应截获(链)引发IOException{
Request originalRequest=chain.Request();
Request.Builder=originalRequest.newBuilder().header(“授权”,
基本凭证(“用户名”、“密码”);
Request newRequest=builder.build();
返回链。继续(新请求);
}
})
.readTimeout(0,时间单位为秒)
.build();
//创建改装对象
改装=新改装.Builder()
.baseUrl(基本URL)
.addConverterFactory(SimpleXmlConverterFactory.create())
.客户(okHttpClient)
.build();
}
//创建并返回http服务
公共的createService(类serviceClass)
{
返回改装。创建(serviceClass);
}
}

有两种方法可以从服务器获取更新。1:使用firebase服务器并使用firebase消息。2.创建一个将永远在后台运行的服务,并检查在线数据库中的任何更改。如果您想要第二种类型的示例,我可以帮助您。谢谢。我对firebase不熟悉,需要仔细阅读。你提到的后台服务涉及什么?它似乎与这个问题有关:我读过这个问题,并承认它是类似的,但这个问题,以及许多与SSE相关的问题似乎已经有好几年的历史了。我知道有API可用,但我找不到可以参考的例子来了解其他人如何处理SSE。对于物联网项目,我不知道hink您应该使用mqtt:。尽管需要构建很多东西