Asynchroniczne pobieranie danych z bazy danych

0

Witam, nie potrafię ogarnąć jednej sprawy... zapytań asynchronicznych do bazy danych. Czy muszę za każdym razem w metodzie onResponse wykonywać czynności na uzyskanych danych? W jaki sposób mogę je zwrócić? Wszystkie tutoriale zatrzymują się na tym momencie, że ustawiają pobrane dane do textview albo napiszą że rób co chcesz.. W jaki sposób mogę zrobić jedną metodę która mi zwraca obiekt po ID i wywoływać ją z różnego miejsca w mojej aplikacji? Wiem, że normalnie nie zwrócę wyników bo zapytanie jest robione w innym niż główny wątek. Pomóżcie proszę, bo nawet nie mam kogo zapytać. Używam bibliotek Volley.

    public void get(String id,String url) {

        JsonObjectRequest request = new JsonObjectRequest(url + String.format("/item/gettest/%s", id), null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        tv.setText(response.toString());
                       // jak zwrócić stąd wyniki?
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        tv.setText(error.toString());
                    }
                }
        );

        VolleyApplication.getInstance(this).getRequestQueue().add(request);
    }
0

W asynch nie ma czegos takiego jak zwrócić to jest podejscie zdarzeniowe/komunikaty.
Musisz wykonać kod w onResponse

Jeżeli chcesz mieć metode która zwraca coś po ID tzn, że albo ta metoda zwraca asynch coś ala Future albo jest po prostu SYNCH bez bajerów

0

w takim razie w jaki sposób zrobić klasę do obsługi bazy danych?

0

Wydaje mi się że koledze chodzi jednak o to, żeby te dane jeszcze odpowiednio obrabiać, a nie od razu do TextView.

Możesz sobie z JSON tworzyć obiekty swojej klasy i dodawać je np do listy, a potem za pomocą np metod przekazywać te dane dalej.

0
panryz napisał(a):

Wydaje mi się że koledze chodzi jednak o to, żeby te dane jeszcze odpowiednio obrabiać, a nie od razu do TextView.

Możesz sobie z JSON tworzyć obiekty swojej klasy i dodawać je np do listy, a potem za pomocą np metod przekazywać te dane dalej.

Załóżmy że tworzę metodę asynchroniczną która pobiera jakiś obiekt z podanego URL. Załóżmy że w planach mam wielokrotne wykorzystywanie tej metody. W jednym miejscu chcę pobrać ten obiekt i przypisać dane(id, nazwa, etc.) do textview. Zaś wywołując to z innego miejsca chcę pobrać obiekt i zapisać go do bazy danych lokalnej sqlite. Teraz z tego co rozumiem muszę stworzyć dwie metody getById:
pierwsza:

 public void getByIdOne(String id,String url) {
 
        JsonObjectRequest request = new JsonObjectRequest(url + String.format("/item/gettest/%s", id), null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                       
                    // TU przekształcamy response i wstawiamy do texview'ów

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        
                    }
                }
        );
 
        VolleyApplication.getInstance(this).getRequestQueue().add(request);
    }

druga:

 public void getByIdTwo(String id,String url) {
 
        JsonObjectRequest request = new JsonObjectRequest(url + String.format("/item/gettest/%s", id), null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                      
                           // TU KOD DO ZAPISYWANIA W LOKALNEJ BAZIE DANYCH


                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        
                    }
                }
        );
 
        VolleyApplication.getInstance(this).getRequestQueue().add(request);
    }

Jak zrobić abym miał uniwersalną jedną metodę getById i mógłbym manipulować implementacją public void onResponse(JSONObject response)?

0

ja bym to zrobił nieco inaczej.

Zrobiłbym miejsce gdzie mam całą kolekcję obiektów moich

Przeparsował odpowiedź za pomoca GSON i odnosił się do elemetów każdego obiektu.

0

Czyli, np. tak: stworzyć przycisk, w którym wywołamy tę metodę(getbyid) i ta metoda wstawi do jakiejś klasy pobrany obiekt. a później pobrać z tej klasy ( np statycznej z updateowanymi obiektami) ten obiekt?

public void clicker(View view){
Dao dao= new Dao();
dao.getByIdOne(id, url);
Item item= Store.getItem();

}
item nie będzie wtedy miał wartości null? bo getbyidone będzie się wykonywało w innym wątku.. Albo nie wiem o co ci chodzi.. :)

0

A co ma tutaj wspólnego Twoje dao i item? To dwa różne obiekty

Taki że w dao pobieram item, wstawiam go do klasy Store a pozniej pobieram. Nie wiem o co chodzi ci w twoim rozwiązaniu po prostu.

0

Tutaj dotykasz problemu wielowątkowości i asynchronicznego przetwarzania danych. W przypadku obiektów Request/Response nie zawsze (tak jak w tym przypadku) wiesz, kiedy one zostaną wykonane, tzn.:

	Object o = val1;
	JsonObjectRequest request = new JsonObjectRequest(url + String.format("/item/gettest/%s", id), null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
 			o = val2;
			// reszta
                    }
                },
		// reszta
        );

	// W tym momencie nie masz pewności, czy request się wykonał. Zmienna o może wskazywać na val1 lub na val2
	doSomething(o);

Dlatego logikę wrzuca się w handlery, które są z automatu wykonywane w momencie zdarzenia.

Wyjścia masz dwa:

  1. Jeśli operacje, które chcesz wykonać na danych za każdym pobraniem są mniej-więcej takie same to stwórz własną implementację Response.Listener - dzięki temu unikniesz pisania raz po raz tego samego.

  2. Jeśli potrzebujesz konkretnego obiektu i potem chcesz z nim coś zrobić to musisz wywołać RESTa synchronicznie. Nie wiem, jak to się robi w Androidzie, ale wklepiesz "json synchronous call android" w Google to powinieneś znaleźć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1