【问题标题】:Reason why onStart finishes before onCreateonStart 在 onCreate 之前完成的原因
【发布时间】:2012-09-02 19:22:27
【问题描述】:

在我正在处理的应用程序上,onCreate 使用 startService() 启动服务,随后,相同的活动在其 onStart 中调用 bindService(到相同的服务)。问题是服务直到 onStart 完成后才初始化,这会导致由空服务引起的空指针异常导致致命错误。如果不使用半途而废的解决方案,我不知道如何解决这个问题,而且我不知道 onStart 在 onCreate 之前是如何完成的。

建议?非常感谢任何帮助。

public class PNetworkService extends Service {
private final IBinder binder = new NtwkSvcBinder(this);


@Override
public void onCreate() {
    // Creates a HandlerThread to process the network events.
    HandlerThread handlerThread = new HandlerThread("SystemStartService",
            Process.THREAD_PRIORITY_BACKGROUND);
    // Starts the network thread.
    handlerThread.start();
    // Obtains looper so that that the NetworkServiceHandler is bound to that looper.
    serviceLooper = handlerThread.getLooper();
    // Create the Network Service Handler.
    nsh = new NetworkServiceHandler(serviceLooper, this);
    messenger = new Messenger(nsh);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand");
    return START_STICKY;
}

@Override
public IBinder onBind(Intent i) {
    Log.i(TAG, "onBind called");
    return binder;
}

public void setExtHandler(Handler extHandler) {
    Log.i(TAG, "setting exthandler");
        nsh.setExtHandler(extHandler);
}
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    我认为主要问题是您假设在 Activity 的 onStart 执行时服务已经在运行,并期望 bindService 立即绑定。但是,通常它不起作用。

    我认为出现这种行为的原因是Android将组件一个一个实例化,认为您无法在Activity的onCreate中同步创建服务。肯定会创建的,但是系统队列之后会去创建这个新的服务。

    如果您只提供正确的连接处理来绑定服务,它会起作用吗?例如移动以下代码

    mConnection.getService().setExtHandler(mapActivityHandler);
    

    到onServiceConnected()内部?

    【讨论】:

    • 我欠你很多。是的,我有一种感觉,这是因为组件是单独实例化的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多