2010-12-13 16 views
0

Ich habe eine appwidget und OnUpdate i nennen diese Methode:android appwidget/sharedpreferences Absturz

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 "";  } 
     } 

die probleme ist: ich manchmal ein nullexception bekommen, und einen Absturz. Was ist das Problem hier?

Antwort

0

Haben Sie myContext auf Context eingestellt?

Nachfolgend wurde nicht geprüft:

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 "";  } 
} 
+0

ja, ich habe auch einen mycontext. Das Seltsame ist, dass Nullexzeption manchmal auftaucht. – lacas

+0

Und ist 'saved_pref_file' gesetzt und existiert? Vielleicht gibt 'mycontext.getSharedPreferences' null zurück und die NPE erscheint auf dem' .getString'. – ccheneson

0

Was die Probleme hier ist?

Das Problem ist, dass Sie sich auf das "Ergebnis" und nicht auf die "Ursache" konzentrieren.

Es ist schwierig, ein Problem zu diagnostizieren, wenn Sie nur eine kleine Codeprobe gegeben haben, und der Grund für einen "Absturz" ist, dass Sie den try/catch-Block auskommentiert haben.

Soweit ich aus diesem kleinen Codebeispiel interpretieren kann, wenn Sie manchmal eine NullPointerException sehen, kann es nur deshalb sein, weil mycontext.getSharedPreferences() ein 'null' zurückgibt. In diesem Fall funktioniert alles, was die Einstellungen speichern soll, nicht.

Schauen Sie sich Ihren Code an, der die Einstellungen speichert - ich vermute, dass hier die Antwort liegt.

EDIT: OK, Blick auf den Code, den Sie in einer Antwort (es sollte wirklich in Ihre Frage bearbeitet worden sein).

Es gibt nur einen Anruf zu saveStringValue() hier ...

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); 
     } 

     ... 

    } 
} 

... und es gibt nur einen Anruf zu loadStringValue() hier ...

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); 
    ... 
} 

Die erste spart "frissitve" und die zweite lädt "listazas", so ist es immer noch unklar, was das Problem ist. Der Punkt, den ich versuche zu machen ist, dass, wenn 'manchmal' eine NullPointerException bei Verwendung von settings.getString() in loadStringValue() erhalten wird, der einzige Grund dafür sein kann, dass saveStringValue() nicht zuvor zum Speichern dieser Zeichenfolge aufgerufen wurde. Sie müssen sehen, warum das manchmal passieren könnte.

0

mein Code:

... 

    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(); 
     } 

    ... 
+0

siehe meine Bearbeitung am Ende meiner Antwort – Squonk