0

私はオンライン mp3 プレーヤーを開発していますが、最初はサービスを使用しないことに決めました。これは、渡すデータが大量にあるためです。AIDL を使用すると非常に複雑になります。代わりに、Player をグローバル シングルトンとして使用します。アプリはほぼ完成しています。すべて正常に動作します (画面がオフになっていても音楽が再生されます)。ただし、プロセス全体が強制終了されることもあります。

そのため、音楽が開始されるたびにローカルのダミー サービス (DummyService など) を開始し、音楽が停止するたびに DummyService を停止することで、OS を「だます」ことを試みました。しかし、それはあまり役に立ちません。プロセスはまだかなり頻繁に強制終了されます:(。

アプリケーションプロセスに「実行中」のサービスがある場合、IMHO-Android OSによって強制終了されない可能性が高くなります。また、DummyService は、MediaPlayer をホストするサービスと大差ありません。MediaPlayer も UI スレッド (サービスが呼び出されたときのデフォルト スレッド) で再生されないためです。

質問は次のとおりです:私のプレーヤー (グローバル静的プレーヤー + DummyService) とサービスによってラップされたプレーヤー(例: MusicDroid こちらhttp://www.helloandroid.com/tutorials/musicdroid-audio-player ) との間に違いはありますか? -part-ii )

ご清聴ありがとうございました、Pham Hung Son

4

3 に答える 3

1

あなたの問題はシングルトンの実装になります。DalvikVM に適しているかどうかについては、多くの議論を読むことができます。これは、そうでない理由の例です。Dalvik GC はあなたのシングルトンを食べてしまうので、別の種類の実装が必要です。

于 2012-06-07T13:19:16.067 に答える
0

これは遅い答えですが、同様の問題と戦っています。

DummyService 内から MP3Singleton を初期化しようとしましたか? 回答に投稿したリンクによると、サービスのライフサイクル内からシングルトンを初期化すると、シングルトンはサービスの期間中メモリに残ります。

于 2015-07-29T18:13:11.930 に答える
0

あなたの答えをヒントとして、もう一度検索して、インターネット上でいくつかの良いものを見つけました。ここにあります(Singleton-Activity-Serviceライフサイクルについて):

http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/

ここに関連する良い回答があります:

シングルトン vs. Android のアプリケーション コンテキスト?

私はシングルトンで遊んでいて、答えが完全に正しくないことがわかりました。アクティビティ A でシングルトン S を作成してから、アクティビティ B に移動しようとしました (A を離れる前に、 A.finish() を呼び出し、 B.onCreate() で System.gc() を呼び出します)-しかし、 S.finalize( ) は呼び出されません。

コードは次のとおりです。

public class FirstAct extends Activity implements OnClickListener {

    public static final String TAG = "Test_Service";
    private View btChange;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.gc();
        setContentView(R.layout.first_lay);
        btChange = findViewById(R.id.btChange);
        btChange.setOnClickListener(this);
        SomeSingleton.getInstance();
    }

    @Override
    public void onClick(View v) {
        Intent i = new Intent(this,SecAct.class);
        startActivity(i);
        this.finish();
    }

    @Override
    protected void onDestroy() {
        Log.i(TAG,"First activity is destroyed !");     
        super.onDestroy();
        System.gc();
    }

}

2 番目のアクティビティ:

public class SecAct extends Activity implements OnClickListener {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.gc();
        setContentView(R.layout.first_lay);
        ((TextView) findViewById(R.id.tvLabel)).setText("Second activity");
        findViewById(R.id.btChange).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent i = new Intent(this,FirstAct.class);
        this.startActivity(i);
        this.finish();
    }


    @Override
    protected void onDestroy() {
        Log.i(FirstAct.TAG,"Second activity is destroyed !");
        super.onDestroy();
        System.gc();
    }

}

シングルトン:

public class SomeSingleton {
    private static volatile SomeSingleton instance = null;
    private static int count = 0;
    private SomeSingleton() {
        count++;
        Log.i(FirstAct.TAG, "Created, instance: #" + count);
    }

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

    @Override
    protected void finalize() throws Throwable {
        Log.i(FirstAct.TAG, "Finalized! ");
        super.finalize();
    }

    public void kill() {
        instance = null;
    }
}
于 2012-06-12T08:36:18.393 に答える