2012-01-12 3 views
2

Я пытаюсь запустить это, но он падает, когда он достигает getDefaultSharedPreferences(). Почему?getDefaultSharedPreferences и авария IntentService

Здесь представлена ​​деятельность по назначению. Он стреляет 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, что выходит из строя. Линия аварии отмечена: «здесь она падает!»

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

Спасибо, Дженс! Я закончил тем, что сказал мне nandeesh. Мне жаль, что я не могу дать вам обоим знак V :) –

+0

Этот ответ неверен, хотя - инициализация (т. Е. Материал, который вы делали бы в конструкторе) идет в #onCreate() - #onHandleIntent можно вызывать несколько раз, и он не называется на основной нити. – Jens

+0

Хорошо. поэтому я сделаю то, что вы говорите. спасибо –

2

В случае IntentService лучше выполнить инициализацию в OnHandleIntent. Также в вашем случае контекст, возможно, не был инициализирован. Поэтому переместите код в конструкторе в OnHandleIntent

+0

_ffs_. Инициализация лучше всего сделать в #onCreate(). Очистка происходит в #onDestroy(). #onHandleIntent() может вызываться несколько раз IntentService, если больше Intents доставляется при обработке первого Intent. – Jens

+0

Спасибо, что ты прав! –

Смежные вопросы