2012-03-31 12 views
1

私はアプリケーションを開発していましたが、問題が発生しました。 サービスから非同期タスクを実行しようとしましたが、動作しませんでした。コードに到達できないと言われています。今は両方ともバックグラウンドで実行されていることを知っていますが、実際には1つのサービスで複数の非同期タスクを制御したいと思っています。どうやってやるの? スレッドを使用する必要がありますか? 私はこの記事を読んで、私は本当にasyncronousタスクを使用するとします。また Difference between Service, Async Task & Thread?androidのサービスから非同期タスクを実行しています

を、それは別のものから非同期タスクを実行することができますか?

ありがとうございました

答えて

2

AsyncTaskは常にメイン/ UIスレッドで動作します。 Serviceが別のプロセスで実行されている場合は、メインスレッドに関連付けられていないため、AsyncTaskServiceに使用できません。

あなたのケースでは、HandlerThreadLooperおよびHandlerを使用して、別のスレッドで重荷重を行うことをお勧めします。

thisの記事を読んでください。

+0

ハンドラは、Androidでスレッドを使用するための素晴らしい方法であり、そうするのも非常に簡単。あなたのメソッドについては、私はあなたのコード – waqaslam

+0

を見ていないので、何も言いませんが、ハンドラを使用してスレッドを使用する必要がありますか?それは悲しいことです –

+0

私は恐れを持っています...;)しかし、心配しないでください、私たちはいつもあなたを助けるためにここにいます:) – waqaslam

0

いくつかのオプションがあります。あなたの仕事とコミュニケーションが必要な場合は、AsyncTaskがあなたの最高の最高のIMOになります。 「火をつけて忘れる」必要があるだけなら、IntentServiceは助けになるかもしれません。

サービスはメインスレッド上で実行されます。ネットワークのダウンロード/アップロードやSQLクエリなどの処理やルックアップが必要な場合は、前述のクラスのonを使用して新しいスレッドに移動する必要があります。

1

あなたのような背景の仕事をしているため、あなたのサービスでHandlerThreadを使用することができます。

public class ServicewithHandlerThread extends Service { 
    private Looper mServiceLooper; 
    private ServiceHandler mServiceHandler; 
    private final class ServiceHandler extends Handler { 
     public ServiceHandler(Looper looper) { 
      super(looper); 
     } 
     @Override 
     public void handleMessage(Message msg) { 

      while (true) { 
       synchronized (this) { 
        try { 
         //YOUR BACKGROUND WORK HERE 
        } catch (Exception e) { 
        } 
       } 
      } 
      stopSelf(msg.arg1); 
     } 
    } 
    @Override 
    public void onCreate() { 
    // Start up the thread running the service. 
    HandlerThread thread = new HandlerThread("ServiceStartArguments", 
      Process.THREAD_PRIORITY_BACKGROUND); 
    thread.start(); 
    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper(); 
    mServiceHandler = new ServiceHandler(mServiceLooper); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 
     return START_STICKY; 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 
+3

コードimrankhanありがとうございます。しかし、 "Process.THREAD_PRIORITY_BACKGROUND"のエラーが発生しました。 "THREAD_PRIORITY_BACKGROUNDは解決できないか、フィールドではありません" –

+1

OK HandlerThreadスレッド=新しいHandlerThread( "ServiceStartArguments")を使用し、このドキュメント[HandlerThread](http ://developer.android.com/reference/android/os/HandlerThread.html) –

+0

Gnag、Waqas right right、AsyncTaskは常にUI.Inサービスから動作し、スレッドを使用してハンドラを使用して通信できます。 –

関連する問題