-1

I'm rather new to coding and my long term goal is to create an android weather app. I've created the main activity and a class, plus I'm using Weatherlib to make things a bit easier.

The main activity asks for permission and grabs the location using GPS. Those coords are sent to the getweather method which grabs the information using OpenWeatherMap. When the data is retrieved, in this case, cloud percentage, what I want it to do is pass that to the main activity to setText for the TextView clouds. My issue is that it's throwing a NullPointerException when I try to do that from onWeatherRetrieved.

public class MainActivity extends AppCompatActivity {

private double latitude;
private double longitude;
private FusedLocationProviderClient fusedLocationClient;
private String response;
private TextView clouds;
private Context context;
private Context x;
private WeatherOWM weatherOWM;


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

    clouds = findViewById(R.id.clouds);


    x = this;
    context = getApplicationContext();
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    requestPermissions();

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    if (ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
        return;
    }
    fusedLocationClient.getLastLocation().addOnSuccessListener (this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            if (location != null){
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                System.out.println(latitude + " " + longitude);
                WeatherOWM loc = new WeatherOWM(latitude, longitude, context);
                loc.getWeather();
            }
        }
    });

}
public void setClouds(Integer cloud) {
    clouds.setText(cloud);
}

private void requestPermissions(){
    ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION}, 1);
}

}

public class WeatherOWM{


private double latitude;
private double longitude;
private Context ma;
WeatherConfig config = new WeatherConfig();
private Object WeatherConfig;
private Object hourForecast;
private Object MainActivity;
private MainActivity mainActivity;


public WeatherOWM(double latitude, double longitude, Context ma){
    this.latitude = latitude;
    this.longitude = longitude;
    this.ma = ma;
}

public void getWeather() {

    TextView clouds = new TextView(ma);

    //Init client
    WeatherClient client = null;
    config.ApiKey = "REDACTED";
    try {
        client = (new WeatherClient.ClientBuilder()).attach(ma)
                .httpClient(WeatherDefaultClient.class)
                .provider(new OpenweathermapProviderType())
                .config(config)
                .build();
    } catch (WeatherProviderInstantiationException e) {
        e.printStackTrace();
    }

    client.getHourForecastWeather(new WeatherRequest(latitude, longitude), new WeatherClient.HourForecastWeatherEventListener() {

        @Override
        public void onWeatherRetrieved(WeatherHourForecast weatherHourForecast) {
            List<HourForecast> hourList = weatherHourForecast.getHourForecast();
            for (HourForecast hourForecast: hourList) {
                Weather weather = hourForecast.weather;
                long timestamp = hourForecast.timestamp;
                mainActivity.setClouds(hourForecast.weather.clouds.getPerc());
                System.out.println(hourForecast.weather.clouds.getPerc());
            }
        }

        @Override
        public void onWeatherError(WeatherLibException wle) {
            System.out.println("ERROR");
        }

        @Override
        public void onConnectionError(Throwable t) {
            System.out.println("ERROR");
        }
    });

}

}

Matt
  • 12,848
  • 2
  • 31
  • 53

1 Answers1

-1

In the WeatherOWM class , you have created an instance of MainActivity as here :

private MainActivity mainActivity;

and in the method , you have written :

mainActivity.setClouds(hourForecast.weather.clouds.getPerc());

the problem is that the variable "mainActivity" has no value and is empty so you have to give value to it.

so in the WeatherOWM class , write this code :

mainActivity = new MainActivity();

please reply is solved your problem