2012-03-28 9 views
0

AsyncTaskを呼び出して、以前に開始したサービスを停止します。 しかし、Asyctaskが実行されている間、ProgressDialogは回転しません。 何か間違っていると思い、ANRエラーで問題が発生する可能性があります。AsyncTaskは実際には非同期では動作しないようです。

アイデア?

new asyncTaskZieladresse().execute(); 

public class asyncTaskZieladresse extends AsyncTask<Void, Integer, Void> { 
    int progress; 
    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     final Spinner Fahrerauswahl = (Spinner)findViewById(R.id.spinner1); 
     final Spinner Fahrzeugauswahl = (Spinner)findViewById(R.id.spinner2); 
     final Spinner Nutzungsartauswahl = (Spinner)findViewById(R.id.spinner3); 
     Cursor mcursor = (Cursor) Fahrerauswahl.getSelectedItem(); 
     Fahrer = mcursor.getString(mcursor.getColumnIndexOrThrow("name")); 
     FahrerID = mcursor.getString(mcursor.getColumnIndexOrThrow("_id")); 
     mcursor.close(); 
     Cursor mcursor1 = (Cursor) Fahrzeugauswahl.getSelectedItem(); 
     Kennzeichen = mcursor1.getString(mcursor1.getColumnIndexOrThrow("fahrzeug_kennzeichen")); 
     KennzeichenID = mcursor1.getString(mcursor1.getColumnIndexOrThrow("_id")); 
     mcursor1.close(); 
     Cursor mcursor2 = (Cursor) Nutzungsartauswahl.getSelectedItem(); 
     Nutzungsart = mcursor2.getString(mcursor2.getColumnIndexOrThrow("nutzungsart")); 
     NutzungsartID = mcursor2.getString(mcursor2.getColumnIndexOrThrow("_id")); 
     mcursor2.close(); 
     VariablenUebergebenGpsFahrt(); 
     progressDialog.dismiss(); 
    } 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     progressDialog = ProgressDialog.show(Main.this, "GPS", "Ziel-Standort wird ermittelt..."); 
    } 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    protected Void doInBackground(Void... arg0) { 
     // TODO Auto-generated method stub 
     stopService(new Intent(Main.this, GPSService.class)); 
     return null; 
    }  

}

+0

バックグラウンドで何もしていないので、AsyncTaskを持っている点は何ですか?これは、空の 'run()'メソッドを使ってスレッドをフォークするのと同じです。 – CommonsWare

+0

私は、次のアクティビティが呼び出されるまでに時には時間がかかるような問題があります。私がやっていることはサービスを停止することです(onDestroy()内の値はsharedprefsに書き込まれた値なので、別のアクティビティでサービスが停止した後に収集された値を読み取ることができます)。スピナーの値をintent.putextra経由で渡し、最後にstartActivity(インテント)を介して新しいアクティビティを呼び出します。私にとっては、stopServiceには多くの時間がかかりましたので、AsyncTaskでstopServiceを停止しようとしていました。私は間違っていますか? – venni

+0

'stopService()'は1ミリ秒以下で十分です。サービスの実際の停止は非同期で行われます。 – CommonsWare

答えて

1

...バックグラウンドで行われます。

私はあなたの質問にコメントで説明しようとしたので、これは役に立たないでしょう。 onDestroy()の時間が長すぎる場合は、その作業を早く、バックグラウンドスレッドで行う必要があります。 stopService()コールをバックグラウンドスレッドに置くことは全く無意味です。

サービス自体は、すでにUIスレッドではなくバックグラウンドで実行されています。

いいえ、そうではありません。

onDestroy()がメインアプリケーションスレッドで呼び出されます。 常にです。

あなたのサービスはは、他の作業のために、独自のバックグラウンドスレッドを持っているかもしれないが、ライフサイクルメソッド(onCreate()onStartCommand()onBind()、およびonDestroy())は、常にメインアプリケーションスレッドで呼ばれています。

サービスの停止に長時間を要した場合、なぜアプリが停止していますか?

onDestroy()であまりにも多くの作業をしているためです。

停止したサービスの復帰を待つサービスとコマンドは、UIスレッドで実行されていません。

onDestroy()は、メインアプリケーションスレッド(a.k.a.、 "UI-thread")で呼び出されます。最初のコメントをもとに


UPDATE:私はサービス

の内側()onDestroyを呼び出すと

あなたはonDestroy()を呼び出すことはありません。 Androidの電話番号はonDestroy()です。あなたはAndroidではありません。

onDestroy()は、サービス自体のサービス内ではなく、メインスレッド内で呼び出されますか?

サービスはスレッドだと思われるようです。そうではない。 the documentation(他のアプリケーションオブジェクトのようなサービスは、ホスティングプロセスのメインスレッドで実行されることに注意してください)。ドキュメントをお読みください。

+0

私はそれを正しく理解していることを確認するだけです。サービス内で(メインではなく)onDestroy()を呼び出すと、onDestroy()はサービス自体のサービス内ではなく、サービスのonDestroy()が呼び出される前に、自分の仕事をするためにサービスでstopコマンドを取得するにはどうすればよいですか? ?瞬間、サービスでonDestroy()を呼び出すことは、私のサービスがユーザーによって停止されていることを知る唯一の方法です。私はstoppサービスにいくつかの共有プレフィックスを書く必要があります。 – venni

1

なぜANRそれは難しい理解するが、あなたはonPostExecute()のEXECものの多くはdoInBackground()に移動することができそうです。 Android開発者は、sql lite操作(コンテンツプロバイダ)とすべての重量操作をasynの方法で実行することを提案します。

1

onPostExecuteのすべてのコードはUIスレッド上で実行されます、doInBackgroundで唯一のコードは、私がAsyncTaskでサービスを停止しようとした理由厥

関連する問題