Problem with Asynctask

Asked

Viewed 93 times

0

Good morning,

I’m having some problems implementing a small app to get the weather coming from the answers of Openweathermap, however I’m having trouble implementing.

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.

I mean, right 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 help me solve this problem?

Regards

2 answers

0

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

I think the problem is in my implementation of the object that later cannot 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 + " ");
        }
    }
}

Meteo:

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 don’t see what you might be doing wrong, since I adapted this example to use the Meteo object and can return more than one parameter, because in the original example it returned only one String temperature.

Someone can help me understand and fix the situation?

0

I think the problem must be here:

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

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

the right one 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 to replace the parameter Meteo... params by String... params

Browser other questions tagged

You are not signed in. Login or sign up in order to post.