Gson, Json w Androidze - prośba o sprawdzenie kodu.

0

Napisalem sobie klase, ktorej zadaniem jest pobieranie danych stad http://maps.googleapis.com/maps/api/geocode/json?address=Gosprzydowa&sensor=true, potrzebuje pobrac tylko to co jest "long_name" w "address_components"
Oto ta klasa:

package com.example.lukasz.test;

import android.os.Build;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.Scanner;

/**
 * Created by lukasz on 26.09.15.
 */
public class WebService {

    public static JSONArray requestWebService(String serviceUrl) {
        final int CONNECTION_TIMEOUT = 300;
        final int DATARETRIEVAL_TIMEOUT = 600;
        disableConnectionReuseIfNecessary();
        HttpURLConnection urlConnection = null;
        try {
            URL urlToRequest = new URL(serviceUrl);
            urlConnection = (HttpURLConnection)
                    urlToRequest.openConnection();
            urlConnection.setConnectTimeout(CONNECTION_TIMEOUT);
            urlConnection.setReadTimeout(DATARETRIEVAL_TIMEOUT);

            InputStream in = new BufferedInputStream(          //TUTAJ TEORETYCZNIE POKAZUJE ZE PROGRAM SIE WYKRACZA, ALE DLACZEGO?                                                                                                                                    
                    urlConnection.getInputStream());
            JSONObject result = new JSONObject(getResponseText(in));
            JSONArray address_components = result.getJSONArray("address_components");
            return address_components;
        } catch (MalformedURLException e) {
            System.out.println("Nie ma takiego miasta");
        } catch (SocketTimeoutException e) {

        } catch (IOException e) {

        } catch (JSONException e) {

        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        return null;
    }

    private static void disableConnectionReuseIfNecessary() {
        if (Build.VERSION.SDK_INT
                < Build.VERSION_CODES.FROYO) {
            System.setProperty("http.keepAlive", "false");
        }
    }
    private static String getResponseText(InputStream inStream) {
        return new Scanner(inStream).useDelimiter("\\A").next();
    }
}

jej wywolanie nastepuje, na skutek kliknieca elementu listView . Tutaj jest kod interfejsu do obslugi tego klikniecia

@EBean
public class ListClickListener implements AdapterView.OnItemClickListener {


    @Background
    public void doInBackground(String cityName) {
        // String address = "http://maps.googleapis.com/maps/api/geocode/json?address=" + cityName + "&sensor=true";
        String address = "http://maps.googleapis.com/maps/api/geocode/json?address=Gosprzydowa&sensor=true";
        JSONArray address_components = WebService.requestWebService(address);
        String infos[] = new String[address_components.length()];

        for (int i = 0; i < infos.length; i++) {
            try {
                JSONArray name = address_components.getJSONArray(0);
                infos[i] = name.getString(0);
                System.out.println(infos[i]);
            } catch (JSONException ex) {

            }
        }

    }

    @UiThread
    void showResult(String translatedText) {

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String cityName = GetCityName.citiesNames.get(position);
        Toast.makeText(view.getContext(), cityName, Toast.LENGTH_SHORT).show();
        doInBackground(cityName);
    }
}

a tutaj to co mi wywala, po wcisnieciu elementu listView

09-26 13:15:09.043 4136-4136/com.example.lukasz.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.lukasz.test, PID: 4136
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
at com.example.lukasz.test.WebService.requestWebService(WebService.java:36)
at com.example.lukasz.test.ListClickListener.doInBackground(ListClickListener.java:45)
at com.example.lukasz.test.ListClickListener.onItemClick(ListClickListener.java:69)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
at android.widget.AbsListView$3.run(AbsListView.java:3879)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Z gory dzieki za wszelka pomoc!!!!

0

Dobra znalqzlem ze wyskakuje mi cos takiego NetworkOnMainThreadException, ale przeciez moj kod nie wykonuje sie w glownym watku skoro zastosowalem @Background? wiec tego nie rozumiem

1

W Androidzie nie powinno się używać System.out.println. Jeżeli chcesz sobie debugować to masz Log.d.

Z kolei błąd wyskakuje prawdopodobnie dlatego, że tworzysz instancję klasy w której jest metoda z @Background bez podkreślenia. Jeżeli dałeś ten kod w activity, to musisz te activity zapisać z podkreśleniem w pliku z manifestem.

0

To jest błąd który mówi o tym że odpytujesz serwis przez internet w głównym wątku. Ponieważ jest to bardzo czasochłonny proces powinien być wykonywany w nowym wątku

1

Dla autora w formie poszerzenia horyzontów i umiejętności polecam poczytać o bibliotece do Androida od Square "Retrofit" i przestać używać przestarzałego ListView na rzecz RecyclerView.

0

@Background robi niby to samo co Retrofit async. Poza tym jest jeszcze Volley. Co do ListView to przecież działa i nie jest deprecated, a RecyclerView jest trudniejsze w użyciu. Poza tym nie róbcie flame. Jak koleś pyta o technologię A to piszcie o A w miarę możliwości, a nie proponujcie B.

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