【问题标题】:getDefaultSharedPreferences and an IntentService crashgetDefaultSharedPreferences 和 IntentService 崩溃
【发布时间】:2012-01-12 13:14:55
【问题描述】:

我正在尝试运行它,但是当它到达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。 崩溃的行标有:“这里崩溃了!”

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

【问题讨论】:

  • 你能发布一个堆栈跟踪吗?这将有助于找到原因。

标签: java android crash preferences intentservice


【解决方案1】:

您在 Service 的构造函数中做了很多事情。

不要不要那样做。覆盖#onCreate() 并在那里进行设置。记得拨打super.onCreate()

【讨论】:

  • 谢谢詹斯!我最终做了nandeesh让我做的事情。我希望我能给你们两个 V 标志:)
  • 这个答案是不正确的 - 初始化(即你在构造函数中做的事情)进入 #onCreate() - #onHandleIntent 可以被多次调用,它不会在主线程上调用。
【解决方案2】:

如果是 IntentService,最好在 OnHandleIntent 中进行初始化。 此外,在您的情况下,上下文可能尚未初始化。所以将构造函数中的代码移动到 OnHandleIntent

【讨论】:

  • ffs。初始化最好在#onCreate() 中完成。清理在#onDestroy() 中进行。如果在处理第一个 Intent 时传递了更多 Intent,则 IntentService 可能会多次调用 #onHandleIntent()。
猜你喜欢
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2012-03-12
  • 2012-06-02
  • 2011-07-20
相关资源
最近更新 更多