Async タスクが正しく動作しない場合があることに気付きました。実際にはdoInBackground() メソッドが呼び出されません。これは主に、そのアクティビティのバックグラウンドでサービスが実行されている場合に発生します。たとえば、音楽がサービスを使用してバックグラウンドで実行される場合、Async タスクはバックグラウンドで XML を解析しません。これは、その doInBackground がその時点で機能せず、progress Dialog または progressBar が回転し続けるためです。
AsyncTask.THREAD_POOL_EXECUTORが次のような問題に役立ついくつかの記事を読みました。
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new Test().execute();
}
しかし、それは私の場合には役に立ちませんでした。上記の実装後に同じ問題が発生しました。
ここで、私が何をしているのかを理解するために、サンプル コードを少しだけ示します::
public class TestAct extends Activity {
ImageButton play,forward,backward;
private ListView mList;
// many more variables
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
//binding the service here
// start service is called
init();
}
private void init(){
play=(ImageButton)findViewById(R.id.playBtn);
forward=(ImageButton)findViewById(R.id.forward);
backward=(ImageButton)findViewById(R.id.backward);
mList=(ListView)findViewById(R.id.list);
new GetData().execute();
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// calling the play() method of ServiceConnection here
}
});
// adding header to Listview
// other code and click listeners
}
class GetData extends AsyncTask<Void, Void, Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
// starting the progress Bar
// initializing the Arraylist,Maps etc
}
@Override
protected Void doInBackground(Void... params) {
//parsing the XML here
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// stop the ProgressBar
// Updating my UI here
// setting Adapter for ListView
}
}
}
これは通常は正常に機能しますが、サービスがバックグラウンドで実行されている場合 (つまり、バックグラウンドで音楽が再生されている場合) にハングします。
この非同期タスクの問題の背後にある正確な理由がわかりません。この場合、手動スレッドの実装は役立ちますか??
まあ、問題は「サービスはメインスレッドで実行されるため、実行するとAsyncTaskの実行がブロックされる」ためだと思います...したがって、バックグラウンドスレッドでサービスを実行できれば、それが役立つと思います. そのため、別のスレッドでサービスを実行するために IntentService を試しましたが、疑問です... IntentService が Service と同様に無期限に実行できるかどうか ... また、IntentService は AsyncTask を数回ブロックします。したがって、この種の問題に対する 100% 完璧な解決策とは思えません。
この問題を整理し、完全なシナリオを理解するのを手伝ってくれる人はいますか?
前もって感謝します。