154

バックグラウンドで継続的に実行するコードが必要です。サービスでやりたくない。他に可能な方法はありますか?

Thread私は自分のクラスを呼び出そうとしましたActivityが、Activityしばらくの間バックグラウンドに留まり、その後停止します。Threadクラスも機能しなくなります。

class testThread implements Runnable {
        @Override
        public void run() {
            File file = new File( Environment.getExternalStorageDirectory(), "/BPCLTracker/gpsdata.txt" );
            int i = 0;

            RandomAccessFile in = null;

            try {
                in = new RandomAccessFile( file, "rw" );
            } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
//String line =null;
            while ( true ) {
                HttpEntity entity = null;
                try {
                    if ( isInternetOn() ) {
                        while ( ( line = in.readLine() ) != null ) {

                            HttpClient client = new DefaultHttpClient();
                            String url = "some url";
                            HttpPost request = new HttpPost( url );
                            StringEntity se = new StringEntity( line );
                            se.setContentEncoding( "UTF-8" );
                            se.setContentEncoding( new BasicHeader( HTTP.CONTENT_TYPE, "application/json" ) );
                            entity = se;
                            request.setEntity( entity );
                            HttpResponse response = client.execute( request );
                            entity = response.getEntity();
                            i++;
                        }
                        if ( ( line = in.readLine() ) == null && entity != null ) {
                            file.delete();
                            testThread t = new testThread();
                            Thread t1 = new Thread( t );
                            t1.start();
                        }


                    } else {
                        Thread.sleep( 60000 );
                    } // end of else

                } catch (NullPointerException e1) {
                    e1.printStackTrace();
                } catch (InterruptedException e2) {
                    e2.printStackTrace();
                } catch (IOException e1) {
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }// end of while
        }// end of run

    }
4

8 に答える 8

415

もしあなたが必要ならば:

  1. バックグラウンド スレッドでコードを実行する

  2. UI に触れたり更新したりしないコードを実行する

  3. 完了までにせいぜい数秒しかかからない (短い) コードを実行する

次に、AsyncTask を使用する次のクリーンで効率的なパターンを使用します。

AsyncTask.execute(new Runnable() {
   @Override
   public void run() {
      //TODO your background code
   }
});
于 2015-07-21T21:03:02.907 に答える
48

バックグラウンドで実行していることを思い出してください。継続的に実行することは、2 つの異なるタスクです。

長期的なバックグラウンド プロセスの場合、スレッドは Android では最適ではありません。ただし、ここにコードを示します。自己責任で行ってください。

正しい方法でアプローチするには、最初にサービスを開始する必要があります。サービス内で、Runnable が必要な Thread/Async タスクを開始する必要があります。

Service と Thread はバックグラウンドで実行されますが、タスクは更新を取得するためにトリガーを作成する (何度も呼び出す) 必要があります。つまり、タスクが完了したら、次の更新のために関数を呼び出す必要があります。

タイマー (周期的トリガー)、アラーム (タイムベース トリガー)、ブロードキャスト (イベント ベース トリガー)、再帰が私たちの機能を目覚めさせます。

public static boolean isRecursionEnable = true;

void runInBackground() {
    if (!isRecursionEnable)
        // Handle not to start multiple parallel threads
        return;

    // isRecursionEnable = false; when u want to stop
    // on exception on thread make it true again  
    new Thread(new Runnable() {
        @Override
        public void run() {
            // DO your work here
            // get the data
            if (activity_is_not_in_background) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // update UI
                        runInBackground();
                    }
                });
            } else {
                runInBackground();
            }
        }
    }).start();
}

サービスの使用: サービス を起動すると、サービスが開始され、タスクが実行され、サービスが STICKY でない場合は、タスクの実行後に終了します。このサービスの終了は、コードの例外またはユーザーが設定から手動で終了したことによっても発生する可能性があります。

START_STICKY (スティッキー サービス) は、サービスが終了した場合にサービスが自動的に再起動するという Android のオプションです。

マルチプロセッシングとマルチスレッドの違いについての質問を覚えていますか? サービスはバックグラウンド プロセスです (UI のないアクティビティと同様)。MainThread (アクティビティ/UI スレッド) の負荷を回避するためにアクティビティでスレッドを起動する方法と同じ方法で、負荷を回避するためにサービスでスレッドを起動する必要があるのと同じ方法です。サービス。

単一のステートメントで、バックグラウンドで継続するタスクを実行する場合は、StickyService を起動し、イベント ベースのサービスでスレッドを実行する必要があります。

于 2013-03-18T08:41:20.647 に答える
24

バックグラウンドで継続的に実行するコードが必要です。サービスでやりたくない。他に可能な方法はありますか?

あなたが探している最も可能性の高いメカニズムはですAsyncTask。バックグラウンドスレッドでバックグラウンド処理を行う場合に直接指定します。また、その主な利点は、メイン (UI) スレッドで実行されるいくつかのメソッドを提供し、タスクの進行状況をユーザーに通知したり、バックグラウンド プロセスから取得したデータで UI を更新したりする場合に UI を更新できるようにすることです。

ここから始める方法がわからない場合は、素晴らしいチュートリアルです。

注:また、それを使用IntentServiceする可能性もありResultReceiverます。

于 2013-03-18T08:37:44.123 に答える
2

AsyncTask の代替手段は robospice です。https://github.com/octo-online/robospice .

ロボスパイスの特徴の一部。

1. 非同期的に (バックグラウンド AndroidService で) ネットワーク リクエストを実行します (例: Spring Android を使用した REST リクエスト)。結果の準備ができたら、UI スレッドでアプリに通知します。

2.強く型付けされている!POJO を使用してリクエストを行い、リクエスト結果として POJO を取得します。

3. リクエストに使用される POJO にも、プロジェクトで使用するアクティビティ クラスにも制約を適用しません。

4. 結果をキャッシュします (Json と Gson の両方、Xml、フラット テキスト ファイル、バイナリ ファイル、ORM Lite を使用した場合でも)。

5. アクティビティ (またはその他のコンテキスト) にネットワーク リクエストの結果を通知する (それらがまだ生きている場合のみ)

6.Android AsyncTasks とは異なり、Android ローダーのようにメモリ リークはまったくありません。UI スレッドでアクティビティを通知します。

7. シンプルだが堅牢な例外処理モデルを使用します。

まずはサンプル。https://github.com/octo-online/RoboSpice-samples .

https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_resultの robospice のサンプル。

更新: 上記の回答は無効になりました。バックグラウンド スレッドに kotlin コルーチンを使用します。

于 2013-03-18T08:44:00.880 に答える