Сбой приложения Android при использовании SharedPreferences.contains()

#java #android #sharedpreferences #android-sharedpreferences

#java #Android #sharedpreferences #android-sharedpreferences

Вопрос:

Прежде всего, я хочу извиниться, если мой английский не совсем правильный, потому что я немец. Также некоторые имена классов / методов / переменных являются немецкими.

Моя проблема в том, что мое приложение всегда вылетает при strtup. Я уже выяснил (путем комментирования разных вещей), что это из-за моего if-условия в методе onResume(), но я не могу решить эту проблему.

Когда приложение завершено, оно должно сообщить мне, что я должен взять в школу на текущий день. Конечно, также будут некоторые дополнительные / интересные функции.

Я уже проверил, что все действия имеют одинаковый макет.

Вот мой код для запуска:

 package de.mbauer.schulplaner;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class Main extends AppCompatActivity {

static SharedPreferences fachPrefs;
static SharedPreferences.Editor fachPrefEdit;
Intent keinFach;

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

    fachPrefs = this.getSharedPreferences("FaecherDatei", Context.MODE_PRIVATE);
    fachPrefEdit = fachPrefs.edit();

    if (!fachPrefs.contains("Fach0")) {
        keinFach = new Intent(Main.this, KeinFachVorhanden.class);
        startActivity(keinFach);
    }
}
@Override
protected void onDestroy() {
    super.onDestroy();
    fachPrefEdit.clear();
    fachPrefEdit.commit();
    }
}
  

Вот действие, вызываемое намерением в onResume():

 package de.mbauer.schulplaner;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class KeinFachVorhanden extends AppCompatActivity implements View.OnClickListener {
    TextView tv1;
    Button btn1;
    Intent faechererstellenOeffnen = new Intent(KeinFachVorhanden.this, FaecherErstellen.class );

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

    btn1 = (Button) findViewById(R.id.button);
    btn1.setOnClickListener(this);
    tv1 = (TextView) findViewById(R.id.textView);
}

@Override
public void onClick(View v) {
    startActivity(faechererstellenOeffnen);
}
}
  

Вот XML-манифест:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.mbauer.schulplaner">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Main">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".FaecherErstellen" />
    <activity android:name=".KeinFachVorhanden"></activity>
</application>
  

Вот LogCat:

 10-06 12:08:45.648 13621-13621/? I/art: Late-enabling -Xcheck:jni
10-06 12:08:45.747 13621-13621/de.mbauer.schulplaner W/System: ClassLoader           referenced unknown path: /data/app/de.mbauer.schulplaner-2/lib/arm64
10-06 12:08:45.754 13621-13621/de.mbauer.schulplaner I/InstantRun: Instant Run Runtime started. Android package is de.mbauer.schulplaner, real application class is null.
10-06 12:08:45.972 13621-13621/de.mbauer.schulplaner W/System: ClassLoader referenced unknown path: /data/app/de.mbauer.schulplaner-2/lib/arm64
10-06 12:08:46.170 13621-13621/de.mbauer.schulplaner W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
10-06 12:08:46.409 13621-13621/de.mbauer.schulplaner I/HwSecImmHelper: mSecurityInputMethodService is null
10-06 12:08:46.419 13621-13621/de.mbauer.schulplaner E/HAL: load: id=gralloc != hmi->id=gralloc
10-06 12:08:46.506 13621-13621/de.mbauer.schulplaner I/Process: Sending signal. PID: 13621 SIG: 9
  

Трассировка стека:

 $ adb shell am start -n "de.mbauer.schulplaner/de.mbauer.schulplaner.Main" -    a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 17199 on device huawei-ale_l21-QLF7N16307003297
W/System: ClassLoader referenced unknown path:    /data/app/de.mbauer.schulplaner-1/lib/arm64
I/InstantRun: Instant Run Runtime started. Android package is    de.mbauer.schulplaner, real application class is null.
W/System: ClassLoader referenced unknown path: /data/app/de.mbauer.schulplaner-1/lib/arm64
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter   android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android. graphics.PorterDuffColorFilter, android.content.res.ColorStateList,  android.graphics.PorterDuff$Mode) would have incorrectly overridden the package- private method in android.graphics.drawable.Drawable
I/HwSecImmHelper: mSecurityInputMethodService is null
E/HAL: load: id=gralloc != hmi->id=gralloc
E/HAL: load: id=gralloc != hmi->id=gralloc
I/OpenGLRenderer: Initialized EGL, version 1.4
W/OpenGLRenderer: load: so=/system/lib64/libhwuibp.so
              dlopen failed: library "/system/lib64/libhwuibp.so" not found
W/OpenGLRenderer: Initialize Binary Program Cache: Load Failed
E/HAL: load: id=gralloc != hmi->id=gralloc
I/Process: Sending signal. PID: 17199 SIG: 9
Application terminated.    
  

Сборка Gradle:

 // Top-level build file where you can add configuration options common to   all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
  

Надеюсь, вы сможете мне помочь.

Хорошего дня 🙂

Комментарии:

1. ваш вывод logcat не завершен, пожалуйста, распечатайте все журналы сбоев

2. Как упоминал Анджали. Пожалуйста, опубликуйте полную трассировку стека.

3. Извините, это все, что он выдает после запуска приложения. Нашел его.

4. Что находится в вашем build.gradle на уровне модуля?

Ответ №1:

Вы должны получить общие настройки следующим образом

 SharedPreference pref = getApplicationContext().getSharedPreferences("CachedResponse", 0);

String hospitalJson = pref.getString("hospitalJson", null);
  

Теперь, если в sharedpreference есть hospitalJson, он вернет строку, в противном случае строка будет нулевой. Затем вы можете проверить, равно ли оно нулю или нет, как в приведенном ниже коде:-

 if (hospitalJson != null) {
 //Do Something
}
  

Комментарии:

1. Спасибо @kshitij jain. Но я думаю, что это проблема, потому что я присваиваю значения и ключи другим методом. Я новичок в разработке Android, поэтому я не знаю, влияет ли это на ваше предложение.

2. Нашел решение, назначив, как вы сделали @kshitij jain, а затем перезаписав значение в моем другом методе.

3. Отлично! Рад, что мой ответ сработал для вас 🙂 @misterBauer

4. ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ Проблема заключалась в том, что вызываемое действие завершилось сбоем, потому что в этом действии ранее было объявлено намерение onCreate() . Это не работает, потому что нет контекста, который можно было бы присвоить намерению перед onCreate() вызовом. Спасибо всем, кто мне помог.