有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 java。lang.NullPointerException无法将文本从类设置为活动

我对编码相当陌生,我的长期目标是创建一个安卓天气应用程序。我已经创建了主活动和一个类,并且我正在使用Weatherlib使事情变得更简单

主要活动请求许可并使用GPS获取位置。这些坐标被发送到getweather方法,该方法使用OpenWeatherMap获取信息。当检索到数据时,在本例中为cloud percentage,我希望它将其传递给TextView clouds的主活动setText。我的问题是,当我尝试从OnWeatherRetrieve执行此操作时,它会抛出一个NullPointerException

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");
        }
    });

}

}


共 (1) 个答案

  1. # 1 楼答案

    在WeatherOWM类中,您创建了MainActivity的一个实例,如下所示:

    private MainActivity mainActivity;
    

    在这个方法中,你写了:

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

    问题是变量“mainActivity”没有值,而且是空的,所以必须给它赋值

    在WeatherOWM类中,编写以下代码:

    mainActivity = new MainActivity();
    

    请回复解决您的问题