android appwidget / sharedpreferences崩溃

时间:2010-12-13 08:11:35

标签: android sharedpreferences

我有一个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,然后崩溃。这有什么问题?

3 个答案:

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

     ...