2

私は Android サービスを持っています。onStart メソッドで Intent アクティビティから多くの文字列を取得し、AsynTask を実行してインターネットからファイルをダウンロードします。

アクティビティが実行されている場合、これは正常に機能しますが、アクティビティを停止すると、onStart メソッドが再起動されますが、意図が null であるため、nullPointerException が発生します。

onStart で service dont エントリを実行し、最初の ayntask を続行してすべてのファイルをダウンロードするにはどうすればよいですか?

これは私のコードです

    @Override
    public void onStart(Intent intent, int startId) {
        desde = intent.getIntExtra("desde", 0);
        hasta = intent.getIntExtra("hasta", 1);
        email = intent.getStringExtra("email");
        password = intent.getStringExtra("password");

        new DescargaFotos().execute();

    }

@Override
    public IBinder onBind(Intent intent) {

        return null;
    }

Inicio.java (UI アクティビティ)

Intent iService = new Intent(contexto,


    ServiceDownloader.class);
                            iService.putExtra("desde", 0);
                            iService.putExtra("hasta", 5);
                            iService.putExtra("email", email);
                            iService.putExtra("password", password);
                            startService(iService);     

編集:

新しい質問:

私は IntentService を使用しており、次のようにサービスをバインドしています。

Intent iService = new Intent(contexto,
                                ServiceDownloader.class);

                        ServiceConnection serviceConector = new ServiceConnection() {

                            @Override
                            public void onServiceDisconnected(ComponentName name) {
                                Log.i("INFO", "Service bound ");
                            }

                            @Override
                            public void onServiceConnected(ComponentName name,
                                    IBinder service) {
                                Log.i("INFO", "Service Unbound ");
                            }
                        };

                        iService.putExtra("desde", 0);
                        iService.putExtra("hasta", 50);
                        iService.putExtra("email", email);
                        iService.putExtra("password", password);
                        startService(iService);
                        bindService(iService, serviceConector,
                                Context.BIND_AUTO_CREATE);

そして今、私の問題は、私のギャラクシーネクサスで、アプリのランタイムリストに入ってアプリを破壊すると、サービスが停止し、ダウンロードを停止し、通知の送信を停止するなどですか? これを解決するには、どのようにサービスをバインドする必要がありますか?

4

3 に答える 3

2

IntentService を使用します。IntentService は、ユーザーが望むことを行うように特別に設計されています。onStart、onStartCommand などを実装する必要はありません。作業はバックグラウンド スレッドで実行されます。作業が完了すると、スレッドは破棄されます。

Activity の状態に関係なく、IntentService は引き続き実行されます。

発生する可能性のある問題の 1 つは、Intent を Activity の間違った場所に送信している、または操作が完了したかどうかを確認していないことです。Intent を送信する前に、SharedPreferences のフラグを確認してください (フラグが存在しない場合は、初めて開始することを意味します)。Intent を送信するときは、SharedPreferences にフラグを保存して、送信したことを示します。IntentService が Intent を受け取ったら、それを受け取ったことを示すようにフラグを更新します。IntentService が終了する前に、フラグを再度更新します。などなど。

于 2012-11-21T22:41:51.903 に答える
1

私はあなたの質問にコメントする評判がないので、答えを書きます:)

まず第一に、私の意見では、あなたのサービスがこれだけを行い、文字列を取得してインターネットからファイルをダウンロードするのであれば、そのサービスは必要ありません。AsyncTaks は問題を解決するのに十分であり、実装がより簡単です。そうすることで、あなたの意図で問題を回避できます。

Android API から:

AsyncTask を使用すると、UI スレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を公開できます。

ただし、サービスを引き続き使用することにした場合は、アクティビティで startService が呼び出されたタイミングを正確に知ることができます。

AsyncTask、Service、IntentService、および Thread をいつ使用するかについて疑問がある場合は、このリンクが役に立ちます。

于 2012-11-21T14:10:56.187 に答える
0

これは私の提案になります...

AsynTask は小さなタスクにのみ使用する必要があるため、AsyncTask ではなくサービスでスレッドを使用します。AsyncTask javadocから次のステートメントを確認してください。

AsyncTask は、ThreadHandlerのヘルパー クラスとして設計されており 、一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。ExecutorThreadPoolExecutor、および FutureTask

したがって、最初からスレッドのステータスを確認してください。実行中の場合は何もしないでください。実行していない場合は、画像をダウンロードするスレッドを開始してください...

于 2012-11-21T18:27:31.053 に答える