【发布时间】:2016-01-08 12:49:34
【问题描述】:
我正在尝试将一些值从活动传递到非活动接收器类以创建通知。我不明白为什么我会在这个问题上出错。我的意思是,我传递了上下文,检索它,并相应地使用它。我阅读了一些关于这个问题的帖子并尽我所能解决它,但这是我能走多远。我在这条线上遇到了错误:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
DailyForecastActivity.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;
}
}
Receiver.java
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)
编辑
我解决了 NPE 错误,但现在我的 SharedPreferences 值得到了“null”。我在 DailyForecastActivity 中进行了调试,我在其中放置了值,那里似乎没有问题。我能够输入我想要的所有值。看起来我无法在 Receive.java 中检索 SharedPreferences。另外作为旁注,由于某种原因,我收到了通知声音,但根本没有收到任何通知。
【问题讨论】:
-
Receiver.java第 42 行有什么内容 -
我认为你的上下文是空的
-
逐行调试并检查哪一行代码中断
-
@RRR 我已经写了给出错误的行。
标签: java android nullpointerexception sharedpreferences