我有一个appwidget,onupdate我称这个方法:
String asd=loadStringValue("asd");
public static String loadStringValue(String sName) {
//try {
SharedPreferences settings = mycontext.getSharedPreferences(saved_pref_file, 0);
return settings.getString(sName,"");
//} catch (Exception ex) { return ""; }
}
问题是:我有时会得到一个nullexception,然后崩溃。这有什么问题?
答案 0 :(得分:0)
您是否已将myContext
设为Context
?
以下内容尚未经过测试:
Context mycontext;
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
mycontext = context;
String asd=loadStringValue("asd");
}
public static String loadStringValue(String sName) {
//try {
SharedPreferences settings = mycontext.getSharedPreferences(saved_pref_file, 0);
return settings.getString(sName,"");
//} catch (Exception ex) { return ""; }
}
答案 1 :(得分:0)
这里有什么问题?
问题在于你专注于'结果'而不是'原因'。
当你只提供一小部分代码时,很难诊断问题,同样重要的是,你看到“崩溃”的原因是因为你已经注释掉了try / catch块。 / p>
据我可以从那个小代码示例中解释,如果你有时看到NullPointerException,那只能是因为mycontext.getSharedPreferences()返回'null'。在这种情况下,任何应该保存偏好的东西都不起作用。
看一下保存首选项的代码 - 我怀疑这就是答案所在。
编辑:好的,看一下你在答案中提供的代码(它确实应该被编辑到你的问题中)。
这里只有一次调用saveStringValue()...
private static void loadmm(RemoteViews updateViews, Context context, int appWidgetId) {
String now_date=getFullHungaryDate();
String mm="";
boolean error=false;
if (isInternetOn()) {
// try {
mm=getALL();
if (!mm.equals("")) {
String frissitve=now_date+" "+getTime();
updateViews.setTextViewText(R.id.mm, Html.fromHtml(mm));
updateViews.setTextViewText(R.id.ma, "Fr. "+frissitve);
saveStringValue("frissitve", frissitve, context);
}
...
}
}
...这里只有一次调用loadStringValue()...
private static String getALL() {
String sOut = "";
String sOutAll = "<br>";
Boolean err = false;
HttpStringCutter Cutter = new HttpStringCutter();
Calendar calendar = Calendar.getInstance();
int hnow=calendar.get(Calendar.HOUR_OF_DAY);
if (hnow>1) hnow--;
String hour=Integer.toString(hnow);
String min=Integer.toString(calendar.get(Calendar.MINUTE));
String LISTAZAS =loadStringValue("listazas", mycontext);
...
}
第一个保存“frissitve”,第二个保存“listazas”,所以仍然不清楚问题是什么。我想要做的一点是,如果'有时'在loadStringValue()中使用settings.getString()时会得到NullPointerException,那么唯一的原因可能是之前没有调用saveStringValue()来保存该字符串。您需要了解为什么有时会发生这种情况。
答案 2 :(得分:0)
我的代码是:
...
public static Context mycontext;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
mycontext=context;
for (int appWidgetId : appWidgetIds) {
PendingIntent newPending = makeControlPendingIntent(context, "update", appWidgetId);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+UPDATE_INTERVAL, UPDATE_INTERVAL, newPending);
try {
newPending.send();
} catch (CanceledException e) {
e.printStackTrace();
}
}
}
@Override
public void onDisabled(Context context) {
context.stopService(new Intent(context, UpdateService.class));
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
context.stopService(new Intent(context, UpdateService.class));
}
public static PendingIntent makeControlPendingIntent(Context context, String command, int appWidgetId) {
Intent active = new Intent(context, UpdateService.class);
active.setAction(command);
active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
Uri data = Uri.withAppendedPath(Uri.parse("mm://widget/id/#"+command+appWidgetId), String.valueOf(appWidgetId));
active.setData(data);
return(PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT));
}
public static class UpdateService extends Service {
private String command;
public static Intent intentx;
@Override
public void onStart(Intent intent, int startId) {
UpdateService.intentx=intent;
command = intent.getAction();
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
try {
if (command!=null) {
if (command.equals("refresh") || command.equals("update")){
buildUpdate(this, appWidgetId);
} else if (command.equals("showall")) {
Intent i =new Intent(mm.mycontext, mmMain.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
}
}
} catch (Exception ex){
buildUpdate(this, appWidgetId);
}
}
public static void buildUpdate(Context context, int appWidgetId) {
RemoteViews updateViews = null;
updateViews = new RemoteViews(context.getPackageName(), R.layout.main);
updateViews.setTextViewText(R.id.loader, "Frissít ("+getTime()+")");
updatewidget(updateViews, context, appWidgetId);
loadmm(updateViews, context, appWidgetId);
}
private static void updatewidget(RemoteViews updateViews, Context context, int appWidgetId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(appWidgetId, updateViews);
}
public final static boolean isInternetOn() {
try {
ConnectivityManager connec = (ConnectivityManager) mycontext.getSystemService(Context.CONNECTIVITY_SERVICE);
if ( connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED ) {
return true;
} else if ( connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED ) {
return false;
}
return false;
} catch (Exception ex) {
return true;
}
}
...
private static String getALL() {
String sOut = "";
String sOutAll = "<br>";
Boolean err = false;
HttpStringCutter Cutter = new HttpStringCutter();
Calendar calendar = Calendar.getInstance();
int hnow=calendar.get(Calendar.HOUR_OF_DAY);
if (hnow>1) hnow--;
String hour=Integer.toString(hnow);
String min=Integer.toString(calendar.get(Calendar.MINUTE));
String LISTAZAS =loadStringValue("listazas", mycontext);
int peroldal =0;
if (LISTAZAS.equals("")) {
peroldal=50;
} else {
peroldal=Integer.parseInt(Beallitasok.listazasok[Integer.parseInt(LISTAZAS)]);
}
...
return sOut;
}
private static void loadmm(RemoteViews updateViews, Context context, int appWidgetId) {
String now_date =getFullHungaryDate();
String mm ="";
boolean error =false;
if (isInternetOn()) {
// try {
mm=getALL();
if (!mm.equals("")) {
String frissitve=now_date+" "+getTime();
updateViews.setTextViewText(R.id.mm, Html.fromHtml(mm));
updateViews.setTextViewText(R.id.ma, "Fr. "+frissitve);
saveStringValue("frissitve", frissitve, context);
}
/*} catch (Exception ex) {
Log.e(TAG+"_ERR","No Internet or Other Error occured.");
error=true;
//mm="Letöltés hiba!";
}*/
} else {
//nincs net
Log.e(TAG+"_ERR","No Internet found.");
mm="NET elérés hiba!";
error=true;
}
if (error) {
//hint(TAG+" Hiba!");
}
updateViews.setTextViewText(R.id.loader, "");
updateViews.setOnClickPendingIntent(R.id.mm, makeControlPendingIntent(context, "showall", appWidgetId));
updateViews.setOnClickPendingIntent(R.id.refresh, makeControlPendingIntent(context, "refresh", appWidgetId));
updatewidget(updateViews, context, appWidgetId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
//load, save
private final static String saved_pref_file="mmm_saved_prefs";
public static String loadStringValue(String sName, Context ctx) {
try {
SharedPreferences settings = ctx.getSharedPreferences(saved_pref_file, 0);
return settings.getString(sName,"");
} catch (Exception ex) { return ""; }
}
public static void saveStringValue(String sName, String sValue, Context ctx) {
SharedPreferences settings = ctx.getSharedPreferences(saved_pref_file, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(sName, sValue);
editor.commit();
}
...