2017-02-07 20 views
0

我有一個設置活動,它帶有一個編輯文本首選項,它保存共享首選項中的一個字符串,它是一個IP地址,然後我有一個廣播接收器,一個AsyncTask調用一項服務。我想製作可自定義的url地址,但是當我撥打電話時並沒有採用當前的ip地址值,但是當我重新啓動我的應用程序時採取了正確的值。我怎麼能解決這個問題。我只粘貼有用的代碼。 在此先感謝廣播接收器不讀取共享首選項中的當前值

public class Broadcast extends BroadcastReceiver { 


@Override 
public void onReceive(final Context context, Intent intent) { 

    preferences = PreferenceManager.getDefaultSharedPreferences(context); 

     new Call().execute(); 

} 



private class Call extends AsyncTask<String, String, String> { 

    String ip; 

    @Override 
    protected String doInBackground(String... params) { 

      ip = preferences.getString("key",""); 


     String result = RestFullConnection.postCall("http://" + ip + ":8080/app/api/bla/sync", params[0]); 
     return result; 

    } 

} 

+++編輯+++ 我打電話在MainActivity廣播,我使用EditTextPreference保存在SP值:

Intent alarmIntent = new Intent(getApplicationContext(), Broadcast.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 5000, 30 * 1000, pendingIntent); 
+0

廣播何時何地被觸發?並將代碼發佈到您保存ip的地方。 –

+0

我編輯我的問題。 – mike5v

回答

0

請的onReceive

試試這個
preferenze = context.getSharedPreferences(PERFERENCE_NAME, 
      Context.MODE_PRIVATE); 

希望它會幫助你。

+0

我試過了,但沒有任何改變:( – mike5v

0

這取決於您如何保存您的SharedPreferences。使用apply()方法將異步存儲該值,因此它不會阻止當前的線程。另一方面,commit()立即保存值。這可能您的情況(請提供您的代碼保存您的SharedPreferences)的問題。

請注意,SharedPreferences在不同進程間無法正常工作!如果您使用的是不同的流程,我建議您使用一些與之配合的機制(例如IPC,數據庫等)。

替代SharedPreferences的替代庫是Tray。它使用Content Provider/Databases並具有類似的語法。你甚至可以從SharedPreferences中導入現有的數據。

+0

,因爲我在我的問題中寫道,我沒有以編程方式保存該值,但使用了一個組件(edittextpreference),它爲我做了 – mike5v

+0

它仍然存在規定的問題 - irtc EditTextPreference 'use'apply()'。 – dipdipdip

+0

現在我們已經理解了這個問題,這可能是解決方案嗎? – mike5v