1

重複の可能性:
Android サービスによりアクティビティが応答しなくなる

サービスを使用して、データベースとビューの間でデータを同期します。しかし、サービスを使用して長いタスクを実行するたびに、サービスが正常に機能せず、ビュー停止応答 (UI でイベントを実行できません) が発生し、サービスが完了するのを待つ必要があります。これが私のサービスです:

public class SyncService extends Service{
private static final String TAG = "SyncService";
@Override
public void onCreate()
{       
    super.onCreate();
}

@Override
public void onDestroy()
{
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent)
{
    Log.d(TAG, "call onBind");
    return new DataManagerBinder();
}

private class DataManagerBinder extends Binder implements IUserDataManager
{
    @Override
    public void doProcess(Activity mView)
    {
        //do some long task (not touch UI thread)
        // this will cause the view not response
        syncDB();
        // update view after process completed
        mView.updateViewOnComplete();
    }

}

クライアントアクティビティでこのサービスをバインドしようとしています

//the interface to handle binder 
IUserDataManager  viewManager = null;    
ServiceConnection serviceConnection = new ServiceConnection()
{

    @Override
    public void onServiceDisconnected(ComponentName name)
    {
        Log.i(TAG, "connection closed unexpectedly");
        viewManager = null;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder binder)
    {
        Log.d(TAG, "serviceConnection onServiceConnected");
        viewManager = (IUserDataManager) binder;
        viewManager.doProcess(MyActivity.this);
    }
};

    Intent intent = new Intent(MyActivity.this, SyncService.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

その解決策を教えてください。前もって感謝します!

4

3 に答える 3

1

他の人がいくつかの回答をしている間、要点が強調されているかどうかはわかりません。Serviceバックグラウンドで自動的に実行されるもののように聞こえますが、そうではありませ。これは、UIを維持せずにインテントに反応できる単なるコードです。ただし、UIスレッドは引き続きサービスの処理を行います。

対照的に、それはあなたが望むもののように見え、バックグラウンドService座ってバックグラウンドスレッドでいくつかの作業を行います。Serviceクラスを使用して新しいスレッドを生成します。これは通常、定義できるインテントへの応答で行われます(通常は自分onStart()または同様のもので)。おそらく、データベースの更新などを実際に行う新しいスレッドを開始し、メインサービスを使用してそのスレッドに調整します。

サービスとも通信したいように見えるので、UIとサービスの間で(バックグラウンドスレッドを調整して)渡すメッセージを追跡するために適切なペアを実装する必要があります。また、(おそらく)何らかの方法でMessengerHandlerまた、サービスとバックグラウンドスレッド間の調整のメッセンジャー)。

他の人が指摘しているようAsyncTaskに、UIスレッドで処理を実行したり、バックグラウンドスレッドを「シームレスに」使用したりすることもできます。

于 2012-06-11T22:28:24.160 に答える
1

サービスに関するドキュメント、特に「サービスとは」を読んでください。段落。サービスはメイン UI スレッドで実行されます。AsyncTaskを見て、問題を解決する必要があります。ここでの作業はバックグラウンド スレッドで行われ、結果は UI スレッドに返されます。

于 2012-06-11T21:07:29.150 に答える
0

Androidは、リソースを節約するためにしばらくするとサービスを終了します。ただし、次のようなものを使用してこれが発生するのを防ぐことができます

int onStartCommand(Intent, int, int){
return START_STICKY;
}

これを参照してください

于 2012-05-18T05:32:43.127 に答える