我注意到有时 Async 任务无法正常工作,实际上它的doInBackground() 方法没有被调用,这主要发生在任何服务在该活动的后台运行时。例如,当音乐在后台运行服务时,Async 任务不会在后台解析 XML,因为它的 doInBackground 在那段时间不起作用,并且进度对话框或进度条一直在旋转。
我在几篇文章中读到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% 完美解决方案。
谁能帮我解决这个问题并理解完整的场景。
提前致谢。