0

私が取り組んでいるアプリケーションでは、onCreate が startService() でサービスを開始し、その後、同じアクティビティが onStart で bindService(同じサービスに対して) を呼び出します。問題は、onStart が完了するまでサービスが初期化されず、null サービスによって引き起こされる nullpointer 例外から致命的なエラーが発生することです。中途半端なソリューションを使用せずにこれを回避する方法がわかりません。onCreateの前にonStartがどのように終了するかわかりません。

提案?どんな助けでも大歓迎です。

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

1 に答える 1

4

主な問題は、アクティビティの onStart が実行されているときにサービスが既に実行されていると想定し、 bindService がすぐにバインドされることを期待していることだと思います。ただし、通常は機能しません。

このような動作の理由は、Android がコンポーネントを 1 つずつインスタンス化するためだと思います。Activity の onCreate 内でサービスを同期的に作成することはできないと思います。確かに作成されますが、システムキューの後、この新しいサービスの作成に進みます。

サービスをバインドするための接続の正しい処理を提供するだけで機能しますか? たとえば、次のコードを移動します

mConnection.getService().setExtHandler(mapActivityHandler);

の中にonServiceConnected()

于 2012-09-02T11:14:37.780 に答える