Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SharedReferences/Context抛出NullPointerException_Java_Android_Nullpointerexception_Sharedpreferences - Fatal编程技术网

Java SharedReferences/Context抛出NullPointerException

Java SharedReferences/Context抛出NullPointerException,java,android,nullpointerexception,sharedpreferences,Java,Android,Nullpointerexception,Sharedpreferences,我试图将一些值从活动传递到非活动接收方类,以便创建通知。我不明白为什么我会在这个问题上出错。我的意思是,我传递上下文,检索它,并相应地使用它。我读了一些关于这个问题的文章,并尽力解决它,但这就是我能走多远。我在这条线上得到了一个eror: SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext); dailyForecasActivity.java publ

我试图将一些值从活动传递到非活动接收方类,以便创建通知。我不明白为什么我会在这个问题上出错。我的意思是,我传递上下文,检索它,并相应地使用它。我读了一些关于这个问题的文章,并尽力解决它,但这就是我能走多远。我在这条线上得到了一个eror:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
dailyForecasActivity.java

public class DailyForecastActivity extends AppCompatActivity {

    private Daily[] mDays;
    public static Context contextOfApplication;
    @Bind(android.R.id.list)
    ListView mListView;
    @Bind(android.R.id.empty)
    TextView mEmptyTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_forecast);
        ButterKnife.bind(this);
        contextOfApplication = getApplicationContext();

        GPSTracker gpsTracker = new GPSTracker(this);
        TextView mLocationLabel = (TextView) findViewById(R.id.locationLabel);
        Intent intent = getIntent();

        Parcelable[] parcelables = intent.getParcelableArrayExtra(MainActivity.DAILY_FORECAST);
        mDays = Arrays.copyOf(parcelables, parcelables.length, Daily[].class);
        DayAdapter adapter = new DayAdapter(this, mDays);
        mListView.setAdapter(adapter);
        mListView.setEmptyView(mEmptyTextView);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String dayOfTheWeek = mDays[position].getDayOfTheWeek();
                String condition = mDays[position].getSummary();
                String tempMin = mDays[position].getTempMin() + "";
                String tempMax = mDays[position].getTempMax() + "";
                int icon = mDays[position].getIconId();

                String message = String.format("%s Summary: %s", dayOfTheWeek, condition);
                Toast.makeText(DailyForecastActivity.this, message, Toast.LENGTH_SHORT).show();
                SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
                editor.putString("summary", condition);
                editor.putString("tempMin", tempMin);
                editor.putString("tempMax", tempMax);
                editor.putString("dayOfTheWeek", dayOfTheWeek);
                editor.putInt("icon", icon);
                editor.apply();
            }
        });

        String area = gpsTracker.getSubLocality(this);
        String city = gpsTracker.getAdminArea(this);
        String country = gpsTracker.getCountryName(this);
        mLocationLabel.setText(area + ", " + city + ", " + country);
    }
    public static Context getContextOfApplication(){
    return contextOfApplication;
    }
}
public class Receiver extends BroadcastReceiver{

    Context applicationContext = DailyForecastActivity.getContextOfApplication();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
    String summary = preferences.getString("summary", null);
    String tempMin = preferences.getString("tempMin", null);
    String tempMax = preferences.getString("tempMax", null);
    String dayOfTheWeek = preferences.getString("dayOfTheWeek", null);
    int icon = preferences.getInt("icon", 0);

    @Override
    public void onReceive(Context context, Intent intent) {
        this.applicationContext = context;
        PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(icon)
            .setContentTitle(dayOfTheWeek + " Weather")
            .setContentText(summary + "Temperature: " + tempMax + "/" + tempMin)
            .setTicker("Daily Weather");

        mBuilder.setContentIntent(pi);
        mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND);
        mBuilder.setAutoCancel(true);

        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());


    }
}
logcat

java.lang.RuntimeException: Unable to instantiate receiver com.theoc.stormy.Receiver: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                                                                at android.app.ActivityThread.handleReceiver(ActivityThread.java:2565)
                                                                at android.app.ActivityThread.access$1700(ActivityThread.java:148)
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360)
                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                at android.os.Looper.loop(Looper.java:135)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5272)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
                                                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                                                                at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:374)
                                                                at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:369)
                                                                at com.theoc.stormy.Receiver.<init>(Receiver.java:42)
                                                                at java.lang.reflect.Constructor.newInstance(Native Method)
                                                                at java.lang.Class.newInstance(Class.java:1572)
                                                                at android.app.ActivityThread.handleReceiver(ActivityThread.java:2560)
                                                                at android.app.ActivityThread.access$1700(ActivityThread.java:148) 
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360) 
                                                                at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                at android.os.Looper.loop(Looper.java:135) 
                                                                at android.app.ActivityThread.main(ActivityThread.java:5272) 
                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
java.lang.RuntimeException:无法实例化receiver com.theoc.stormy.receiver:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
位于android.app.ActivityThread.HandlerReceiver(ActivityThread.java:2565)
在android.app.ActivityThread.access$1700(ActivityThread.java:148)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5272)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
在android.preference.PreferenceManager.GetDefaultSharedReferencesName(PreferenceManager.java:374)中
在android.preference.PreferenceManager.GetDefaultSharedReferences(PreferenceManager.java:369)中
在com.theoc.stormy.Receiver(Receiver.java:42)
位于java.lang.reflect.Constructor.newInstance(本机方法)
位于java.lang.Class.newInstance(Class.java:1572)
位于android.app.ActivityThread.HandlerReceiver(ActivityThread.java:2560)
在android.app.ActivityThread.access$1700(ActivityThread.java:148)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5272)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
编辑


我解决了NPE错误,但现在我的SharedReferences值为“null”。我在DailyForecastActivity中运行了一个调试,在这里我输入了值,看起来没有问题。我可以把所有我想要的价值观。看起来我无法在Receive.java中检索SharedReferences。另外,作为旁注,由于某种原因,我收到了通知声音,但根本没有收到任何通知。

onReceive中初始化
SharedReference

preferences = PreferenceManager.getDefaultSharedPreferences(context);
调用您的
广播接收器
时,您的活动可能为空

请尝试执行以下操作:

首先,通过链接到类在清单中恢复应用程序

<application
    android:name = ".App"
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >

}

我总是通过以下方式获得我的共享首选项:

context.getSharedPreferences(PREFERENCE_FILENAME, Context.MODE_PRIVATE);
您还可以验证是否在应用程序数据/目录中创建了首选项文件。
请仔细阅读共享首选项在android中的工作原理。

通过调用
dailyForecasActivity.java

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
Receiver.java中

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
您正在调用两个不同的
SharedReferences
实例。您将保存在一个中,然后尝试从第二个中获取,在第二个中您没有保存任何内容,因此您将获得所有值的
null
。您必须将其联合起来,并在第一种和第二种情况下使用,如:

SharedPreferences sharedPref = getPreferences("MyPref", Context.MODE_PRIVATE);
日常预测活动中

SharedPreferences sharedPref = context.getPreferences("MyPref", Context.MODE_PRIVATE);
接收器中
,这将导致获得相同的实例

您也可以尝试使用相同的
上下文
Context
get from
getActivity()
Context
get from
getApplicationContext()
不同。因此,在这两种情况下都使用
getApplicationContext()
,或者传递
Context