2010-12-13 22 views
0

私はappwidgetを持っている、と私は、このメソッドを呼び出すにonUpdate:アンドロイド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

myContextContextに設定しましたか?

次はテストされていません。

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

+0

'saved_pref_file'が設定されていますか?たぶん 'mycontext.getSharedPreferences'はnullを返し、NPEは' .getString'で発生します – ccheneson

0

ここproblemeは何ですか?

問題は、あなたが「原因」ではなく「結果」に集中していることです。

コードのサンプルを少ししか与えていないときに、try/catchブロックをコメントアウトしたため、「クラッシュ」が表示されている理由と同じように、問題の診断が難しくなります。

この小さなコード例からわかるように、NullPointerExceptionが表示されることがある場合は、mycontext.getSharedPreferences()が 'null'を返すためにのみ発生します。その場合、環境設定を保存するものは何も動作していません。

環境設定を保存しているコードを見てみましょう。私はその答えがどこにあるのか疑いがあります。

編集:OK、答えで入力したコードを見てください(本当にあなたの質問に編集されているはずです)。

あり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"と2番目の読み込み "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

関連する問題