リモートサービスからシングルトンクラスを作成するandroid

私はリモートサービスを作成しました。このリモートサービスでは、私はシングルトンオブジェクトを作成しています。作成したオブジェクトは、そのゴミが収集されるまで保持されます。今、私はシングルトンクラスの中からこのオブジェクトにアクセスするとき、私は正しいオブジェクトを取得します。しかし、私はそれを外部クラスからアクセスしているときにそれはシングルオブジェクトはnullであり、私のクラスは再び作成されています。私はすべての初期化されたオブジェクトを失っています。

私のシングルトンクラスは次の通りです

class myFactory {

    private static myFactory instance;

    private myFactory(){
    }

    public static myFactory getInstance(){
        if(instance == null) {
            instance = new myFactory();
        }
        return instance;
    }
} 

私はオブジェクトがガベージコレクションを取得するかどうかをチェックするためにシングルトンクラスでファイナライズしようとしましたが、その関数には入っていません。

Outside the connection factory object where ever i access this singleton object i am getting null and therefore new object is created > what am i doing wrong?

0
誰があなたにヌルを得ていると言ったのですか? nullを取得することはできません。あなたは新しいインスタンスを得ることを意味しますか?
追加された 著者 Sherif elKhatib,

1 答え

これはシングルトンなので、なぜうまくいかないのかわかりません。しかし、私はシングルトンをIPCコンテキストのようなもので使用しようとしていると思います。それは問題です(遠隔サービスは常に新しいスレッドです)。

問題は:シングルトンが必要なのはなぜですか?より良いソリューションはありませんか?あなたのサービス構造全体を知りませんが、サービスにバインドしている間にFactoryのインスタンスを取得するのは理にかなっています。

あなたがより多くの情報を与えることができるなら、それは助けることができます

0
追加された
サービスは同じスレッドで実行されますか?もしそうでなければ、すべてのスレッドに独自のクラスローダがあるという問題があります。つまり、シングルトンが動作しないのです。おそらく、あなたはおそらく最も安全なアプローチである(おそらく、ANRを避けるためにすべてのものを別のスレッドで実行するので)サービスからファクトリを取得することも検討する必要があります。バインドされたサービスのヒント
追加された 著者 Philipp Wendt,
私が正しく理解していれば、サーバーと同じスレッド/プロセスにあるBroadcastReceiverを作成したいと思っています。しかし、それは何ですか? BroadcastReceiverは、BroadcastReceiverを起動する関数以外のスレッドで実行され、プロセス間で複雑なオブジェクトをマーシャリング/アンマーシャリングしないで交換することはできません。多分それを正しく理解していないかもしれませんが、私が正しく理解していれば、AIDLを調べるべきです
追加された 著者 Philipp Wendt,
私はあなたのクラスでアクセスできるはずのオブジェクトをいくつか作成していきます。これは工場パターンオブジェクトの一種です。このオブジェクトが破壊されたときにのみ、新しいオブジェクトを作成したかったのです...ファクトリオブジェクトは、いくつかのワーカークラスによって使用されるアクティビティでは使用されません。
追加された 著者 Shrikanth Kalluraya,
構造はサービスのようなもので、サービスはサービスを開始し、サービスはファクトリオブジェクトを作成します。ファクトリオブジェクトのメンバは、ネットワークレイヤのようなアプリケーションの下のレイヤによって使用されます。
追加された 著者 Shrikanth Kalluraya,
サービスは異なるプロセスで実行されています。フィリップおそらくあなたが言っているのは正しい方向です...私はマニフェストで定義されている放送受信機でサービスによって作成されたシングルトンにアクセスしていました。私が試みるのは、サービスと同じプロセスでbroadcastrecieverを取得することです。異なるプロセスでサービスを実行するために、私はandroid:process = ":remote"と指定しました。私が同じことを放送受信機に与えると、サービスと同じプロセスになるでしょう
追加された 著者 Shrikanth Kalluraya,