2010-12-13 35 views
0

我有一个appwidget,和我的OnUpdate调用此方法:的Android appwidget/sharedpreferences崩溃

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

的probleme是:我得到一个nullexception有时,和崩溃。这里有什么问题?

回答

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

是的,我有一个mycontext了。奇怪的是有时会出现裸视。 – lacas 2010-12-13 09:14:39

+0

并且'saved_pref_file'已设置并存在?也许'mycontext.getSharedPreferences'返回null,并且NPE发生在'.getString' – ccheneson 2010-12-13 09:18:09

0

什么是probleme这里?

问题是你专注于'结果'而不是'原因'。

当您只给出一小段代码样本时,很难诊断问题,同样重要的是,您看到“崩溃”的原因是因为您已将try/catch块注释掉。

据我可以从这个小代码示例解释,如果你有时看到一个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()来保存该字符串。你需要看看为什么有时会发生这种情况。

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

    ... 
+0

在我的回答结尾处看到我的编辑 – Squonk 2010-12-15 00:18:36