Почему в этом действии появляется ошибка нулевого объекта? - PullRequest
0 голосов
/ 11 мая 2018

Я использую модификацию для извлечения данных. Я пытался запустить приложение из виджета.Но приложение падает из-за нулевого объекта.Я попытался проверить объект ... он не равен нулю после извлечения данных из API, но позже он становится нулевым .. почему?есть ли способ правильно извлечь данные .. как приложения выбирают данные после нажатия виджета?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.master_list);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //Checking to see if the app is opened by widget by checking existence of startFromWidget value from intent
    if (getIntent().getExtras().getString("stringFromWidget") != null) {

        //App opened by widget
        fromWidget = true;

        //Getting last stored value from Database assign it to temp
        Cursor c = getContentResolver().query(DBContract.CONTENT_URI, null, null, null);
        assert c != null;
        c.moveToFirst();
        String temp = c.getString(c.getColumnIndex(DBContract.RECIPE_NAME));

        //Fetching data from API
        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        Call<List<ApiResponce>> call = apiService.getResponce();
        call.enqueue(new Callback<List<ApiResponce>>() {
            @Override
            public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
                reciepeObject = response.body().get(3);

                //Making sure data is received 
                Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine 
            }

            @Override
            public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
                Log.e("networkError", t.getMessage());
            }
        });
    }

    //if the app not opened by widget get the object from the intent 
    else {
        reciepeObject = getIntent().getParcelableExtra(getString(R.string.object));
    }

    //Null Object error from recipeObject.getName().. why ?
    getSupportActionBar().setTitle(reciepeObject.getName());

Logcat:

05-11 12: 42: 48.558 6978-6978 / facebooklogintest.cavepass.com.bakingapp E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: facebooklogintest.cavepass.com.bakingapp, PID: 6978 java.lang.RuntimeException: Невозможно запустить действие..bakingapp.UI.MasterListClass}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName ()' для ссылки на пустой объект в android.app..ActivityThread.performLaunchActivity (ActivityThread.java:2817) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1593) в android.os.Handler.dispatchMessage (Handler.java:105) в android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6541) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName () 'для ссылки на пустой объект в facebooklogintest.cavepass.com.bakingapp.UI.MasterListClass.onCreate (MasterListClass.java:100) в android.app.Activity.performCreate (Activity.java:6975) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1213) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2770) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java: 2892) at android.app.ActivityThread.-wrap11 (неизвестный источник: 0)на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1593) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6541) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) 05-11 12: 42: 48.621 2661-6708 / com.google.android.googlequicksearchbox: search E / ContentStoreEUAS: не удалось зафиксировать отложенные действия 05-11 12: 42: 49.066 2057-2086 / system_process E / ActivityManager: applyOptionsLocked: неизвестный animationType = 0

1 Ответ

0 голосов
/ 11 мая 2018

Move

getSupportActionBar().setTitle(reciepeObject.getName());

внутри onResponse

call.enqueue(new Callback<List<ApiResponce>>() {
            @Override
            public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
                reciepeObject = response.body().get(3);

                getSupportActionBar().setTitle(reciepeObject.getName());                   
                //^^^^^^^^^^^^ 
                Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine 
            }

            @Override
            public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
                Log.e("networkError", t.getMessage());
            }
        });

, поскольку вызовы REST асинхронны, поэтому для их завершения потребуется некоторое время, и ответ может быть использован только один раз, если onResponseсрабатывает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...