2012-01-12 3 views
2

これを実行しようとしていますが、getDefaultSharedPreferences()になるとクラッシュします。 なぜですか?getDefaultSharedPreferencesとIntentServiceのクラッシュ

ここでは、設定のアクティビティを示します。それはここで

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.preference.PreferenceActivity; 
import android.preference.PreferenceManager; 

public class CCTDetectorActivity extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 

    private SharedPreferences settings; 
    static public String nameOfFile = "name_of_file"; 
    static public String nameOfFileDefaultValue = "detected_f.xml"; 
    static public String portNumber = "port_number"; 
    static public String portNumberDefaultValue = "25015"; 
    static public String keepAlive = "keep_alive"; 
    static public String keepAliveDefaultValue = "3"; 
    static public String nameOfSettings = "settings"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.layout.cct_detector_preferences_ui); 
     settings = PreferenceManager.getDefaultSharedPreferences(this); 
     settings.registerOnSharedPreferenceChangeListener(this); 
     updateViews(); 
    } 

    @Override 
    protected void onDestroy() { 
     Intent intent = new Intent(getBaseContext(), CCTDetectorService.class); 
     startService(intent); 
     super.onDestroy(); 
    } 

    private void updateViews() { 
     setSummeryfromPreferencesView(nameOfFile, nameOfFileDefaultValue); 
     setSummeryfromPreferencesView(portNumber, portNumberDefaultValue); 
     setSummeryfromPreferencesView(keepAlive, keepAliveDefaultValue); 
    } 

    private void setSummeryfromPreferencesView(String viewName, String DefValue) { 
     String value = settings.getString(viewName, DefValue); 
     EditTextPreference editTextView = (EditTextPreference) findPreference(viewName); 
     editTextView.setText(value); 
     editTextView.setSummary(value); 
    } 

    public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { 
     updateViews(); 
    } 
} 

を破壊クラッシュ IntentServiceでいるとき IntentService起動します。 クラッシュの行に「ここがクラッシュします!」とマークされています。

import android.app.IntentService; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.util.Log; 

public class CCTDetectorService extends IntentService { 

    private File serializedXmlFile; 
    private DatagramSocket udpSocket; 
    private boolean m_Listening = true; 
    private ActiveCCTs activeCCTs = new ActiveCCTs(); 
    private SharedPreferences preferences; 
    private Serializer serializer = new Persister(); 

    public CCTDetectorService() throws SocketException { 
     super("CCTDetectorServiceThread"); 
     int port; 
     String FILENAME; 
     // here it crashes! 
     preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     port = getIntFromSettingsEditText(CCTDetectorActivity.portNumber, 
       CCTDetectorActivity.portNumberDefaultValue); 
     activeCCTs.keepAlive = getIntFromSettingsEditText(
       CCTDetectorActivity.keepAlive, 
       CCTDetectorActivity.keepAliveDefaultValue); 
     FILENAME = preferences.getString(CCTDetectorActivity.nameOfFile, 
       CCTDetectorActivity.nameOfFileDefaultValue); 
     serializedXmlFile = new File(FILENAME); 
     udpSocket = new DatagramSocket(port); 
     udpSocket.setBroadcast(true); 
    } 
} 
+0

スタックトレースを投稿できますか?原因の特定に役立ちます。 – chesterbr

答えて

8

あなたはサービスのコンストラクタで多くのことをしています。

do なしを実行します。 #onCreate()を上書きして、そこで設定してください。 super.onCreate()に電話することを忘れないでください。

+0

ありがとう、ジェンス!ナンディーズが私に言ったことをやってしまった。私はあなたに両方のV記号を与えることができたらいいと思う:) –

+0

#onCreate()#onHandleIntentは複数回呼び出すことができ、それは呼び出されない初期化(すなわち、あなたがコンストラクタで行うだろうもの)メインスレッドで – Jens

+0

私はあなたの言うことをやります。ありがとう@jens ...ありがとう –

2

IntentServiceの場合は、OnHandleIntentで初期化を行う方が良いです。 また、あなたのケースでは、コンテキストが初期化されていない可能性があります。したがって、コンストラクタ内のコードをOnHandleIntentに移動させてください。

+0

_ffs_。初期化は#onCreate()で行うのが最適です。クリーンアップは#onDestroy()で行われます。 #onHandleIntent()は、最初のインテントを処理している間にさらにインテントが配信される場合、IntentServiceによって複数回呼び出されることがあります。 – Jens

+0

ありがとうございます! –

関連する問題