Android 将数据从服务发送到Roomdatabase的最佳方式

Android 将数据从服务发送到Roomdatabase的最佳方式,android,service,repository,android-room,android-livedata,Android,Service,Repository,Android Room,Android Livedata,我正在做一个项目,我需要连接到服务器以获取数据并从地图上的数据中绘制标记,每当数据发生变化时,我需要用新的位置更新地图 我使用一个Roomdatabase、Livedata来观察更改,并使用一个连接到服务器并向存储库发送任何更新的服务。但最好的办法是什么呢 提前谢谢 编辑: 这是到目前为止我的代码,我将尝试解释我所设想的工作方式 首先,我有一个网关实体 @Entity(tableName = "gateway_table") public class Gateway {

我正在做一个项目,我需要连接到服务器以获取数据并从地图上的数据中绘制标记,每当数据发生变化时,我需要用新的位置更新地图

我使用一个Roomdatabase、Livedata来观察更改,并使用一个连接到服务器并向存储库发送任何更新的服务。但最好的办法是什么呢

提前谢谢

编辑:

这是到目前为止我的代码,我将尝试解释我所设想的工作方式

首先,我有一个网关实体

@Entity(tableName = "gateway_table")
public class Gateway {
    
    private float temp;
    private float wertX;
    private float wertY;
    private String title;
    private boolean drawn;
    private ArrayList<String> ObjectANames = new ArrayList<>();


    @PrimaryKey(autoGenerate = true)
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public float getWertX() {
        return wertX;
    }

    public float getWertY() {
        return wertY;
    }

    public void setWertX(float wertX) {
        this.wertX = wertX;
    }

    public void setWertY(float wertY) {
        this.wertY = wertY;
    }

    public boolean isDrawn() {
        return drawn;
    }

    public void setDrawn(boolean drawn) {
        this.drawn = drawn;
    }

    public float getTemp() {
        return temp;
    }

    public void setTemp(float temp) {
        this.temp = temp;
    }

    public ArrayList<String> getObjectANames() {
        return ObjectANames;
    }

    public Gateway (float wertX, float wertY, String title, boolean drawn, ArrayList<String> ObjectANames){
        this.wertX = wertX;
        this.wertY = wertY;
        this.title = title;
        this.drawn = drawn;
        this.ObjectANames.addAll(ObjectANames);
    }
}
基本上,每个网关在地图上都有一个位置(来自两个浮动)、一个标题、一个布尔值和一个包含ObjectA名称的arraylist。 ObjectA有一个名称、一个包含分配给它的网关的字符串和一个布尔值。 因此,网关可以有多个ObjectA,但每个ObjectA只有一个网关

在这两个DAO中,我都有一个findGateway/ObjectA方法,在该方法中我给出了标题或名称,然后我得到了返回该名称的网关或ObjectA

这是Viewmodel:

public class ViewModel extends AndroidViewModel {
    private Repository repository;
    private LiveData<List<ObjectA>> allObjectA;
    private LiveData<List<Gateway>> allGateways;
    private MutableLiveData<SocketService.MyBinder> binderViewModel = new MutableLiveData<>();

    public ViewModel(@NonNull Application application) {
        super(application);
        repository = new Repository(application);
        allObjectA = repository.getAllObjectA();
        allGateways = repository.getAllGateways();

    }

    public void insert(ObjectA objectA) throws InterruptedException {
        repository.insert(objectA);
    }

    public void delete(ObjectA objectA) throws InterruptedException {
        repository.delete(objectA);
    }

    public void deleteAllObjectA() throws InterruptedException {
        repository.deleteAllObjectA();
    }

    public void update(ObjectA objectA) throws InterruptedException {
        repository.update(objectA);
    }

    public ObjectA findObjectA(String ObjectAName) throws InterruptedException { return repository.findObjectA(ObjectAName);}

    public LiveData<List<ObjectA>> getAllObjectA(){
        return allObjectA;
    }


    public void insert(Gateway gateway) throws InterruptedException {
        repository.insert(gateway);
    }

    public void delete(Gateway gateway) throws InterruptedException {
        repository.delete(gateway);
    }

    public void deleteAllGateways() throws InterruptedException {
        repository.deleteAllGateways();
    }

    public void update(Gateway gateway) throws InterruptedException {
        repository.update(gateway);
    }

    public Gateway findGateway(String gatewayDesignation) throws InterruptedException { return repository.findGateway(gatewayDesignation);}

    public LiveData<List<Gateway>> getAllGateways(){
        return allGateways;
    }

    
    private ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            SocketService.MyBinder binder = (SocketService.MyBinder) iBinder;
            binderViewModel.postValue(binder);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binderViewModel.postValue(null);
        }

    };

    public ServiceConnection getServiceConnection(){
        return serviceConnection;
    }

    public LiveData<SocketService.MyBinder> getMyBinder(){
        return binderViewModel;
    }

}
这是ObjectAMarker

public class ObjectAMarker extends MapMarker {

    private int pos;

    public ObjectAMarker(Context context, float x, float y, String name, int pos) {
        super(context, x, y, name);
        this.pos = pos;
        setImageResource(R.drawable.kuh2_foreground);
    }

    public int getPos() {
        return pos;
    }

}
以及地图活动

public class MapMarkerActivity extends AppCompatActivity {
    public static final int REQUEST_CONNECTION_STATUS = 0;

    private MapViewExt mapView;
    private TextView textView;
    private EditText textX;
    private EditText textY;
    private Button button;
    private Button buttonDelete;
    private Boolean calledFirstTime = true;
    private Boolean gatewayMoved = false;
    private FrameLayout frameLayout;
    private Observer<List<Gateway>> observerGateways;
    private Observer<List<ObjectA>> observerObjectA;

    private ArrayList<GatewayMarker> gatewayMarkers;
    private ArrayList<ObjectAMarker> ObjectAMarkers;

    private ViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_marker);

        textX = findViewById(R.id.edit_text_x);
        textY = findViewById(R.id.edit_text_y);
        button = findViewById(R.id.button);
        buttonDelete = findViewById(R.id.button_delete);
        frameLayout = findViewById(R.id.frame_layout_show_barn);
        textView = findViewById(R.id.text_view_connection_mapmarker);

        viewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(ViewModel.class);


        buttonDelete.setEnabled(false);
        button.setEnabled(false);

        mapView = makeMapView();

        if (mapView != null) {
            mapView.setId(R.id.mapview_id);
            mapView.setSaveEnabled(true);
            frameLayout.addView(mapView);
        }


    }

    private MapViewExt makeMapView() {
        // hier Code to create the map
    }


    private GatewayMarker findGatewayMarker(String title) {
        GatewayMarker gatewayMarker1 = null;
        for (GatewayMarker gatewayMarker : gatewayMarkers) {
            if (gatewayMarker.getName().equals(title)) {
                gatewayMarker1 = gatewayMarker;
            }
        }
        return gatewayMarker1;
    }

    private ObjectAMarker findObjectAMarker(String name) {
        ObjectAMarker objectAMarker = null;
        for (ObjectAMarker objectAMarker1 : ObjectAMarkers) {
            if (objectAMarker1.getName().equals(name)) {
                objectAMarker = objectAMarker1;
            }
        }
        return objectAMarker;
    }


    private ObjectAMarker addNewObjectAMarker(MapViewExt mapView, float x, float y, String name, int pos) {
        ObjectAMarker objectAMarker = new ObjectAMarker(this, x, y, name, pos);
        mapView.addMarker(objectAMarker);
        return objectAMarker;
        //MarkerApiKt.addMarker(mapView, marker, x, y, -0.5f, -0.5f, 0f, 0f);
    }

    private GatewayMarker addNewGatewayMarker(MapViewExt mapView, Gateway gateway) {
        boolean[] posTaken = new boolean[3];
        posTaken[0] = false;
        posTaken[1] = false;
        posTaken[2] = false;
        GatewayMarker gatewayMarker = new GatewayMarker(this, gateway, posTaken);
        mapView.addMarker(gatewayMarker);
        return gatewayMarker;
    }

    @Override
    protected void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);

        gatewayMarkers = new ArrayList<>();
        ObjectAMarkers = new ArrayList<>();

        observerGateways = new Observer<List<Gateway>>() {
            @Override
            public void onChanged(List<Gateway> gateways) {
                for (Gateway gateway : gateways) {

                    if (!gateway.isDrawn()) {


                        if (calledFirstTime || gatewayMoved) {

                            gatewayMoved = false;
                            GatewayMarker gatewayMarker = addNewGatewayMarker(mapView, gateway);
                            gatewayMarkers.add(gatewayMarker);

                            gateway.setDrawn(true);
                            try {
                                viewModel.update(gateway);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            for (int i = 0; i < gateway.getObjectANames().size(); i++) {
                                ObjectAMarker objectAMarker;
                                if (!gatewayMarker.getPosTaken()[0]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXfirstPos(), gatewayMarker.getYfirstPos(), gateway.getObjectANames().get(i), 0);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[0] = true;

                                } else if (!gatewayMarker.getPosTaken()[1]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXSecondPos(), gatewayMarker.getYSecondPos(), gateway.getObjectANames().get(i), 1);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[1] = true;

                                } else if (!gatewayMarker.getPosTaken()[2]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXThirdPos(), gatewayMarker.getYThirdPos(), gateway.getObjectANames().get(i), 2);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[2] = true;
                                    return;
                                }

                            }
                        }

                    } else {
                        GatewayMarker gatewayMarker = findGatewayMarker(gateway.getTitle());
                        for (int i = 0; i < gateway.getObjectANames().size(); i++) {
                            try {
                                if (!viewModel.findObjectA(gateway.getObjectANames().get(i)).isDrawn()) {

                                    if (!gatewayMarker.getPosTaken()[0]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);

                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXfirstPos(), gatewayMarker.getYfirstPos(), gateway.getObjectANames().get(i), 0));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[0] = true;
                                    } else if (!gatewayMarker.getPosTaken()[1]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);
                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXSecondPos(), gatewayMarker.getYSecondPos(), gateway.getObjectANames().get(i), 1));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[1] = true;
                                    } else if (!gatewayMarker.getPosTaken()[2]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);
                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXThirdPos(), gatewayMarker.getYThirdPos(), gateway.getObjectANames().get(i), 2));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[2] = true;
                                    } else {
                                        return;
                                    }
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }

                    }
                }
                calledFirstTime = false;
            }

        };
        observerObjectA = new Observer<List<ObjectA>>() {

            @Override
            public void onChanged(List<ObjectA> objectAS) {

            }
        };


        viewModel.getAllObjectA().observe(this, observerObjectA);
        viewModel.getAllGateways().observe(this, observerGateways);
    }

    @Override
    protected void onPause() {
        super.onPause();

        List<ObjectA> allKühe = viewModel.getAllObjectA().getValue();
        List<Gateway> allGateways = viewModel.getAllGateways().getValue();

        for (ObjectA objectA : allKühe) {
            objectA.setDrawn(false);
            try {
                viewModel.update(objectA);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        for (Gateway gateway : allGateways) {
            gateway.setDrawn(false);
            try {
                viewModel.update(gateway);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        viewModel.getAllGateways().removeObserver(observerGateways);
        viewModel.getAllObjectA().removeObserver(observerObjectA);
        calledFirstTime = true;

        for (int i = 0; i < ObjectAMarkers.size(); i++) {
            MarkerApiKt.removeMarker(mapView, ObjectAMarkers.get(i));
        }

        ObjectAMarkers.clear();
        for (int i = 0; i < gatewayMarkers.size(); i++) {
            MarkerApiKt.removeMarker(mapView, gatewayMarkers.get(i));
        }
        gatewayMarkers.clear();

        EventBus.getDefault().unregister(this);

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getconnectionstatus(IntentServiceResult intentServiceResult) throws InterruptedException {
        if (intentServiceResult.getResult() == REQUEST_CONNECTION_STATUS) {
            textView.setText(intentServiceResult.getResultvalue());
        }

        if (intentServiceResult.getResult() == 1) {
            ObjectA objectA = intentServiceResult.getResultObjectA();
            ObjectA objectAOld = intentServiceResult.getResultObjectAOld();
            Gateway gateway = viewModel.findGateway(objectA.getGateway());
            Gateway gatewayOld = viewModel.findGateway(objectAOld.getGateway());

            gatewayOld.getObjectANames().remove(objectAOld.getName());
            gateway.getObjectANames().add(objectA.getName());

            viewModel.update(gatewayOld);
            viewModel.update(gateway);

            ObjectAMarker objectAMarker = findObjectAMarker(objectAOld.getName());
            GatewayMarker gatewayMarker = findGatewayMarker(gatewayOld.getTitle());
            gatewayMarker.getPosTaken()[objectAMarker.getPos()] = false;
            MarkerApiKt.removeMarker(mapView, objectAMarker);
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

public class GatewayMarker extends MapMarker {

    private Gateway gateway;
    private boolean[] posTaken;

    public GatewayMarker(Context context, Gateway gateway, boolean[] posTaken) {
        super(context, gateway.getWertX(), gateway.getWertY(), gateway.getTitle());

        this.gateway = gateway;
        this.posTaken = posTaken;
        setImageResource(R.drawable.gateway_foreground);
    }

    public float getXfirstPos() {
        return gateway.getWertX() + 0.05f;
    }

    public float getYfirstPos() {
        return gateway.getWertY() + 0.05f;
    }

    public float getXSecondPos() {
        return gateway.getWertX() - 0.05f;
    }

    public float getYSecondPos() {
        return gateway.getWertY() + 0.05f;
    }

    public float getXThirdPos() {
        return gateway.getWertX();
    }

    public float getYThirdPos() {
        return gateway.getWertY() - 0.05f;
    }

    public boolean[] getPosTaken() {
        return posTaken;
    }



}

public class ObjectAMarker extends MapMarker {

    private int pos;

    public ObjectAMarker(Context context, float x, float y, String name, int pos) {
        super(context, x, y, name);
        this.pos = pos;
        setImageResource(R.drawable.kuh2_foreground);
    }

    public int getPos() {
        return pos;
    }

}
public class MapMarkerActivity extends AppCompatActivity {
    public static final int REQUEST_CONNECTION_STATUS = 0;

    private MapViewExt mapView;
    private TextView textView;
    private EditText textX;
    private EditText textY;
    private Button button;
    private Button buttonDelete;
    private Boolean calledFirstTime = true;
    private Boolean gatewayMoved = false;
    private FrameLayout frameLayout;
    private Observer<List<Gateway>> observerGateways;
    private Observer<List<ObjectA>> observerObjectA;

    private ArrayList<GatewayMarker> gatewayMarkers;
    private ArrayList<ObjectAMarker> ObjectAMarkers;

    private ViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_marker);

        textX = findViewById(R.id.edit_text_x);
        textY = findViewById(R.id.edit_text_y);
        button = findViewById(R.id.button);
        buttonDelete = findViewById(R.id.button_delete);
        frameLayout = findViewById(R.id.frame_layout_show_barn);
        textView = findViewById(R.id.text_view_connection_mapmarker);

        viewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(ViewModel.class);


        buttonDelete.setEnabled(false);
        button.setEnabled(false);

        mapView = makeMapView();

        if (mapView != null) {
            mapView.setId(R.id.mapview_id);
            mapView.setSaveEnabled(true);
            frameLayout.addView(mapView);
        }


    }

    private MapViewExt makeMapView() {
        // hier Code to create the map
    }


    private GatewayMarker findGatewayMarker(String title) {
        GatewayMarker gatewayMarker1 = null;
        for (GatewayMarker gatewayMarker : gatewayMarkers) {
            if (gatewayMarker.getName().equals(title)) {
                gatewayMarker1 = gatewayMarker;
            }
        }
        return gatewayMarker1;
    }

    private ObjectAMarker findObjectAMarker(String name) {
        ObjectAMarker objectAMarker = null;
        for (ObjectAMarker objectAMarker1 : ObjectAMarkers) {
            if (objectAMarker1.getName().equals(name)) {
                objectAMarker = objectAMarker1;
            }
        }
        return objectAMarker;
    }


    private ObjectAMarker addNewObjectAMarker(MapViewExt mapView, float x, float y, String name, int pos) {
        ObjectAMarker objectAMarker = new ObjectAMarker(this, x, y, name, pos);
        mapView.addMarker(objectAMarker);
        return objectAMarker;
        //MarkerApiKt.addMarker(mapView, marker, x, y, -0.5f, -0.5f, 0f, 0f);
    }

    private GatewayMarker addNewGatewayMarker(MapViewExt mapView, Gateway gateway) {
        boolean[] posTaken = new boolean[3];
        posTaken[0] = false;
        posTaken[1] = false;
        posTaken[2] = false;
        GatewayMarker gatewayMarker = new GatewayMarker(this, gateway, posTaken);
        mapView.addMarker(gatewayMarker);
        return gatewayMarker;
    }

    @Override
    protected void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);

        gatewayMarkers = new ArrayList<>();
        ObjectAMarkers = new ArrayList<>();

        observerGateways = new Observer<List<Gateway>>() {
            @Override
            public void onChanged(List<Gateway> gateways) {
                for (Gateway gateway : gateways) {

                    if (!gateway.isDrawn()) {


                        if (calledFirstTime || gatewayMoved) {

                            gatewayMoved = false;
                            GatewayMarker gatewayMarker = addNewGatewayMarker(mapView, gateway);
                            gatewayMarkers.add(gatewayMarker);

                            gateway.setDrawn(true);
                            try {
                                viewModel.update(gateway);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            for (int i = 0; i < gateway.getObjectANames().size(); i++) {
                                ObjectAMarker objectAMarker;
                                if (!gatewayMarker.getPosTaken()[0]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXfirstPos(), gatewayMarker.getYfirstPos(), gateway.getObjectANames().get(i), 0);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[0] = true;

                                } else if (!gatewayMarker.getPosTaken()[1]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXSecondPos(), gatewayMarker.getYSecondPos(), gateway.getObjectANames().get(i), 1);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[1] = true;

                                } else if (!gatewayMarker.getPosTaken()[2]) {
                                    objectAMarker = addNewObjectAMarker(mapView, gatewayMarker.getXThirdPos(), gatewayMarker.getYThirdPos(), gateway.getObjectANames().get(i), 2);
                                    ObjectAMarkers.add(objectAMarker);

                                    try {
                                        ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                        objectA.setDrawn(true);
                                        viewModel.update(objectA);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                    gatewayMarker.getPosTaken()[2] = true;
                                    return;
                                }

                            }
                        }

                    } else {
                        GatewayMarker gatewayMarker = findGatewayMarker(gateway.getTitle());
                        for (int i = 0; i < gateway.getObjectANames().size(); i++) {
                            try {
                                if (!viewModel.findObjectA(gateway.getObjectANames().get(i)).isDrawn()) {

                                    if (!gatewayMarker.getPosTaken()[0]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);

                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXfirstPos(), gatewayMarker.getYfirstPos(), gateway.getObjectANames().get(i), 0));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[0] = true;
                                    } else if (!gatewayMarker.getPosTaken()[1]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);
                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXSecondPos(), gatewayMarker.getYSecondPos(), gateway.getObjectANames().get(i), 1));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[1] = true;
                                    } else if (!gatewayMarker.getPosTaken()[2]) {
                                        ObjectAMarker objectAMarker = findObjectAMarker(gateway.getObjectANames().get(i));
                                        ObjectAMarkers.remove(objectAMarker);
                                        ObjectAMarkers.add(addNewObjectAMarker(mapView, gatewayMarker.getXThirdPos(), gatewayMarker.getYThirdPos(), gateway.getObjectANames().get(i), 2));

                                        try {
                                            ObjectA objectA = viewModel.findObjectA(gateway.getObjectANames().get(i));
                                            objectA.setDrawn(true);
                                            viewModel.update(objectA);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }

                                        gatewayMarker.getPosTaken()[2] = true;
                                    } else {
                                        return;
                                    }
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }

                    }
                }
                calledFirstTime = false;
            }

        };
        observerObjectA = new Observer<List<ObjectA>>() {

            @Override
            public void onChanged(List<ObjectA> objectAS) {

            }
        };


        viewModel.getAllObjectA().observe(this, observerObjectA);
        viewModel.getAllGateways().observe(this, observerGateways);
    }

    @Override
    protected void onPause() {
        super.onPause();

        List<ObjectA> allKühe = viewModel.getAllObjectA().getValue();
        List<Gateway> allGateways = viewModel.getAllGateways().getValue();

        for (ObjectA objectA : allKühe) {
            objectA.setDrawn(false);
            try {
                viewModel.update(objectA);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        for (Gateway gateway : allGateways) {
            gateway.setDrawn(false);
            try {
                viewModel.update(gateway);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        viewModel.getAllGateways().removeObserver(observerGateways);
        viewModel.getAllObjectA().removeObserver(observerObjectA);
        calledFirstTime = true;

        for (int i = 0; i < ObjectAMarkers.size(); i++) {
            MarkerApiKt.removeMarker(mapView, ObjectAMarkers.get(i));
        }

        ObjectAMarkers.clear();
        for (int i = 0; i < gatewayMarkers.size(); i++) {
            MarkerApiKt.removeMarker(mapView, gatewayMarkers.get(i));
        }
        gatewayMarkers.clear();

        EventBus.getDefault().unregister(this);

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getconnectionstatus(IntentServiceResult intentServiceResult) throws InterruptedException {
        if (intentServiceResult.getResult() == REQUEST_CONNECTION_STATUS) {
            textView.setText(intentServiceResult.getResultvalue());
        }

        if (intentServiceResult.getResult() == 1) {
            ObjectA objectA = intentServiceResult.getResultObjectA();
            ObjectA objectAOld = intentServiceResult.getResultObjectAOld();
            Gateway gateway = viewModel.findGateway(objectA.getGateway());
            Gateway gatewayOld = viewModel.findGateway(objectAOld.getGateway());

            gatewayOld.getObjectANames().remove(objectAOld.getName());
            gateway.getObjectANames().add(objectA.getName());

            viewModel.update(gatewayOld);
            viewModel.update(gateway);

            ObjectAMarker objectAMarker = findObjectAMarker(objectAOld.getName());
            GatewayMarker gatewayMarker = findGatewayMarker(gatewayOld.getTitle());
            gatewayMarker.getPosTaken()[objectAMarker.getPos()] = false;
            MarkerApiKt.removeMarker(mapView, objectAMarker);
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

@androidx.room.Database(entities = {ObjectA.class, Gateway.class}, version = 26)
@TypeConverters({Converters.class})
public abstract class Database extends RoomDatabase {

    private static volatile Database instance;

    public abstract ObjectADAO cowDAO();
    public abstract GatewayDAO gatewayDAO();

    public static synchronized Database getInstance(Context context){

        if (instance == null){
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    Database.class,"database")
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return instance;
    }
}