0

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 が発生し、クラッシュします。ここでの問題は何ですか?

4

3 に答える 3

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

     ...
于 2010-12-13T13:51:26.440 に答える
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 "";      }
}
于 2010-12-13T08:53:06.763 に答える
0

ここでの問題は何ですか?

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

コードの小さなサンプルしか提供していない場合、問題を診断するのは困難です。同様に重要なことに、「クラッシュ」が発生する理由は、try/catch ブロックをコメントアウトしたためです。

その小さなコード例から解釈できる限り、NullPointerException が時々表示される場合は、mycontext.getSharedPreferences() が「null」を返していることが原因である可能性があります。その場合、設定を保存するはずのものが機能していません。

設定を保存しているコードを見てください-答えはそこにあると思います。

編集:わかりました、回答で提供したコードを見てください(実際には質問に編集されているはずです)。

ここで saveStringValue() への呼び出しは 1 つだけです...

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() への呼び出しが 1 つだけあります...

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() が呼び出されていないことです。なぜそれが時々起こるのかを調べる必要があります。

于 2010-12-13T09:33:43.140 に答える