android appwidget/sharedpreferences crash
I have an appwidget, and onupdate i call this method:
String asd=loadStringValue("asd");
public static String loadStringValue(String sName) {
//try开发者_StackOverflow {
SharedPreferences settings = mycontext.getSharedPreferences(saved_pref_file, 0);
return settings.getString(sName,"");
//} catch (Exception ex) { return ""; }
}
the probleme is: i get a nullexception sometimes, and a crash. What is the probleme here?
Have you set myContext
to a Context
?
The following has not been tested:
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 ""; }
}
my code is:
...
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();
}
...
What is the probleme here?
The problem is that you're concentrating on the 'result' and not the 'cause'.
It's difficult to diagnose a problem when you've only given a small sample of code and, just as importantly, the reason you're seeing a 'crash' is because you've commented out the try/catch block.
As far as I can interpret from that small code example, if you're sometimes seeing a NullPointerException it can only be because mycontext.getSharedPreferences() is returning a 'null'. In that case, whatever is supposed to be saving the preferences isn't working.
Take a look at your code which is saving the preferences - I suspect that's where the answer lies.
EDIT: OK, looking at the code you supplied in an answer (it really should have been edited into your question).
There is only one call to saveStringValue() here...
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);
}
...
}
}
...and there's only one call to loadStringValue() here...
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);
...
}
The first saves "frissitve" and the second loads "listazas" so it's still unclear what the problem is. The point I'm trying to make is that if 'sometimes' you get a NullPointerException when using settings.getString() in loadStringValue() then the only reason can be that saveStringValue() hasn't been called previously to save that string. You need to look at why that might happen sometimes.
精彩评论