Problem with AsyncTask

0

Good morning,

I'm having some problems implementing a small app to get the weather coming from OpenWeatherMap responses, however I'm having trouble implementing it.

Main Activity:

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static final String APP_ID = "api_id";

private static final int PERMISSION_ACCESS_COARSE_LOCATION = 1;
private GoogleApiClient googleApiClient;

private TextView textView;
private TextView textView_humidity;


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

    textView = (TextView) findViewById(R.id.textView);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },
                PERMISSION_ACCESS_COARSE_LOCATION);
    }

    googleApiClient = new GoogleApiClient.Builder(this, this, this).addApi(LocationServices.API).build();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_ACCESS_COARSE_LOCATION:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // All good!
            } else {
                Toast.makeText(this, "Need your location!", Toast.LENGTH_SHORT).show();
            }

            break;
    }
}

@Override
protected void onStart() {
    super.onStart();
    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}

@Override
protected void onStop() {
    googleApiClient.disconnect();
    super.onStop();
}

@Override
public void onConnected(Bundle bundle) {
    Log.i(MainActivity.class.getSimpleName(), "Connected to Google Play Services!");

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

        double lat = lastLocation.getLatitude();
        double lon = lastLocation.getLongitude();

        String units = "metric";
        String url = String.format("http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=%s&appid=%s",
                lat, lon, units, APP_ID);
        new GetWeatherTask(textView).execute(url);
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.i(MainActivity.class.getSimpleName(), "Can't connect to Google Play Services!");
}

private class GetWeatherTask extends AsyncTask<Meteo, Void, Meteo> {
    private TextView textView;
    private TextView textView_humidity;

    public GetWeatherTask(TextView textView) {
        this.textView = textView;
    }


    @Override
    protected Meteo doInBackground(Meteo... params) {
        Meteo meteo = new Meteo();
        String weather = "UNDEFINED";

        try {
            URL url = new URL(params[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();

            String inputString;
            while ((inputString = bufferedReader.readLine()) != null) {
                builder.append(inputString);
            }


            JSONObject topLevel = new JSONObject(builder.toString());
            JSONObject main = topLevel.getJSONObject("main");
            meteo.temperatura = String.valueOf(main.getDouble("temp"));
            meteo.humidade = String.valueOf(main.getDouble("humidity"));

            urlConnection.disconnect();
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
        return meteo;
    }

    @Override
    protected void onPostExecute(Meteo meteo) {
        textView.setText("Current Weather: " + meteo.temperatura + " ºC");
        textView.setText("Current Humidity: " + meteo.humidade + " ºC");
    }
}

}

Meteo Class:

public class Meteo {

public String temperatura;
public String humidade;
public String vento;

public Meteo()
{
    temperatura = "";
    humidade = "";
    vento = "";
}

public Meteo(String tEmperatura, String hUmidade, String vEnto)
{
    temperatura = tEmperatura;
    humidade = hUmidade;
    vento = vEnto;
}

public String getTemperatura(){
    return temperatura;
}

public String getHumidade (){
    return humidade;
}

public String getVento()
{
    return vento;
}

}

Basically my problem is in the URL.

That is, here:

  

new GetWeatherTask (textView) .execute (url);

     

URL url = new URL (params [0]);

I'm still not very familiar with these elements either url, or asynctasks could they help me to solve this problem?

Greetings

    
asked by anonymous 27.11.2016 / 15:46

2 answers

0

I think the problem should be here:

 protected Meteo doInBackground(Meteo... params) {
    Meteo meteo = new Meteo();
    String weather = "UNDEFINED";

    try {
        URL url = new URL(params[0]);

The right thing should be to send the url to:             URL url = new URL (params [0]);

and the value of params [0] has to be a link, but in this case you are not sending a link but the meteo.

try replacing the Meteo parameter ... params by String ... params

    
27.11.2016 / 17:18
0

I have not yet been able to get this little app working, and now there is no value in either temperature or humidity or wind.

I think the problem is in my implementation of the object which afterwards can not be loaded with the values received from the service ...

MainActivity:

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    private static final String APP_ID = "api_key";

    private static final int PERMISSION_ACCESS_COARSE_LOCATION = 1;
    private GoogleApiClient googleApiClient;

    private TextView textView;
    private TextView textView_humidity;


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

        textView = (TextView) findViewById(R.id.textView);
        textView_humidity = (TextView) findViewById(R.id.textView_humidity);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },
                    PERMISSION_ACCESS_COARSE_LOCATION);
        }

        googleApiClient = new GoogleApiClient.Builder(this, this, this).addApi(LocationServices.API).build();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_ACCESS_COARSE_LOCATION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // All good!
                } else {
                    Toast.makeText(this, "Need your location!", Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (googleApiClient != null) {
            googleApiClient.connect();
        }
    }

    @Override
    protected void onStop() {
        googleApiClient.disconnect();
        super.onStop();
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.i(MainActivity.class.getSimpleName(), "Connected to Google Play Services!");

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

            double lat = lastLocation.getLatitude();
            double lon = lastLocation.getLongitude();

            String units = "metric";
            String url = String.format("http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=%s&appid=%s",
                    lat, lon, units, APP_ID);
            new GetWeatherTask(textView, textView_humidity).execute(url);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(MainActivity.class.getSimpleName(), "Can't connect to Google Play Services!");
    }

    private class GetWeatherTask extends AsyncTask<String, Void, Meteo> {
        private TextView textView;
        private TextView textView_humidity;

        public GetWeatherTask(TextView textView, TextView textView_humidity) {
            this.textView = textView;
            this.textView_humidity = textView_humidity;
        }


        @Override
        protected Meteo doInBackground(String... params) {
            Meteo meteo = new Meteo();
            String weather = "UNDEFINED";

            try {
                URL url = new URL(params[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
                StringBuilder builder = new StringBuilder();

                String inputString;
                while ((inputString = bufferedReader.readLine()) != null) {
                    builder.append(inputString);
                }


                JSONObject topLevel = new JSONObject(builder.toString());
                JSONObject main = topLevel.getJSONObject("main");
                meteo.temperatura = String.valueOf(main.getDouble("temp"));
                meteo.humidade = String.valueOf(main.getDouble("humidity"));

                urlConnection.disconnect();
            } catch (IOException | JSONException e) {
                e.printStackTrace();
            }
            return meteo;
        }

        @Override
        protected void onPostExecute(Meteo meteo) {
            textView.setText("Current Weather: " + meteo.temperatura + " ºC");
            textView_humidity.setText("Current Humidity: " + meteo.humidade + " ");
        }
    }
}

Weather:

public class Meteo {

    public String temperatura;
    public String humidade;
    public String vento;

    public Meteo()
    {
        temperatura = "";
        humidade = "";
        vento = "";
    }

    public Meteo(String tEmperatura, String hUmidade, String vEnto)
    {
        temperatura = tEmperatura;
        humidade = hUmidade;
        vento = vEnto;
    }

    public String getTemperatura(){
        return temperatura;
    }

    public String getHumidade (){
        return humidade;
    }

    public String getVento()
    {
        return vento;
    }
}

I'm not seeing what I might be doing wrong, since I adapted this example to use the Meteo object and could return more than one parameter, because in the original example it returned only a String temperature.

Can anyone help me to understand and correct the situation?

    
01.12.2016 / 00:54