Пустая ссылка на объект в retrofit

Кто-нибудь знает, почему у меня есть ссылка на нулевой объект? Я перепробовал много решений и ничего. Logcat и Android Profiler показывают данные API, но я не могу решить эту проблему. Любые идеи?

public class MainActivity extends AppCompatActivity implements MainInterface {


@BindView(R.id.city_textview) TextView city_textview;
@BindView(R.id.temp_textview) TextView temp_textview;
@BindView(R.id.icon_imageview) ImageView icon_imageview;

private String TAG = "MainActivity";
private double latitude;
private double longitude;
private Currently currently;
private Currently currently1;


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

    ButterKnife.bind(this);

    getWeather(currently);
    getCurrentConditions(currently1);

}


@Override
public  void getWeather(final Currently currently) {
    latitude = 37.8267;
    longitude = -122.4233;
    NetworkClient.getInstance().getWeather(latitude, longitude).enqueue(new Callback<Currently>() {

        @Override
        public void onResponse(@NonNull Call<Currently> call, @NonNull final Response<Currently> response) {
            getCurrentConditions(response.body());
        }

        @Override
        public void onFailure(Call<Currently> call, Throwable t) {
            Log.d(TAG, "Failed" + t.getMessage());
        }
    });



}


public void getCurrentConditions(Currently currentlyweather) {
    String timezone = currentlyweather.getTimezone();
   city_textview.setText(String.valueOf(currentlyweather.getTimezone()));

}
}

какие-либо отзывы после ответов ниже?

Lino 10.08.2018 17:27
0
1
931
2

Ответы 2

Попробуйте этот код ...

public class ApiClient {
private final static String BASE_URL = "https://api.github.com"; // define your url..

public static ApiClient apiClient;
private Retrofit retrofit = null;

public static ApiClient getInstance() {
    if (apiClient == null) {
        apiClient = new ApiClient();
    }
    return apiClient;
}

//private static Retrofit storeRetrofit = null;

public Retrofit getClient() {
    return getClient(null);
}


private Retrofit getClient(final Context context) {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.readTimeout(60, TimeUnit.SECONDS);
    client.writeTimeout(60, TimeUnit.SECONDS);
    client.connectTimeout(60, TimeUnit.SECONDS);
    client.addInterceptor(interceptor);
    client.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            return chain.proceed(request);
        }
    });

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();


    return retrofit;
}

}

и api вызывает интерфейс создания таким образом ..

public interface ApiInterface {
@POST("registrion")
Call<ResponseData> userReg(@Body User user);

}

и вызовите api в действии или фрагменте таким образом ..

 ApiInterface apiInterface = ApiClient.getInstance().getClient().create(ApiInterface.class);
    User user=new User();
    user.setEmail("abcd@gmail.com");
    user.setPassword("123");
    user.setFirstName("Vikas");
    Call<ResponseData> dataCall=apiInterface.userReg(user);
    dataCall.enqueue(new Callback<ResponseData>() {
        @Override
        public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
            if (response!=null && response.isSuccessful() && response.body()!=null){
                // show message
            }
        }

        @Override
        public void onFailure(Call<ResponseData> call, Throwable t) {
        Log.d("Error",t.getMessage());
        }
    });

Я использовал этот код, но все тот же. Но спасибо за попытку помочь. Думаю, мне хватит Retrofit - ужасный инструмент.

user9897182 11.08.2018 16:23

На onCreate() вы вызвали

getCurrentConditions(currently1);

однако переменная currently1, которую вы указываете в качестве первого параметра, - это null, поскольку она не инициализирована. Это явно означает, что обе строки кода, определенные в методе getCurrentConditions, будут выдавать NullPointerException.

Попробуйте установить значение переменной currently1.

Хорошо, но какое значение?

user9897182 11.08.2018 15:24

ну, это зависит от логики вашего приложения.

Lino 11.08.2018 15:41

Я использовал вашу идею и ... это не сработало, но я установил интерфейс Api в OnCreate, а этот код - на OnResponse, и он работает. Данные о погоде = response.body (); если (response.isSuccessful ()) {city_textview.setText (data.getName ()); temp_textview.setText (String.valueOf (data.getMain (). getTemp (‌))); } Благодарю за помощь.

user9897182 13.08.2018 13:40

Другие вопросы по теме