Android appwidget / sharedpreferences crash - PullRequest
       3

Android appwidget / sharedpreferences crash

0 голосов
/ 13 декабря 2010

У меня есть 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 голосов
/ 13 декабря 2010

В чем здесь проблема?

Проблема в том, что вы концентрируетесь на «результате», а не на «причине».

Трудно диагностировать проблему, когда вы дали только небольшой пример кода, и, что не менее важно, причина, по которой вы видите «сбой», заключается в том, что вы закомментировали блок 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», так что до сих пор неясно, в чем проблема. Я хочу подчеркнуть, что если «иногда» вы получаете NullPointerException при использовании settings.getString () в loadStringValue (), то единственной причиной может быть то, что saveStringValue () ранее не вызывался для сохранения этой строки. Вам нужно посмотреть, почему это иногда случается.

0 голосов
/ 13 декабря 2010

мой код:

...

    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 голосов
/ 13 декабря 2010

Вы установили 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 "";      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...