在我的Android应用程序中,我使用THREAD_POOL_EXECUTOR使用多个AsyncTask,这使得任务并行运行。有时应用程序挂起。以下是我使用的代码。
如何找到应用挂起的点?
new fetchInitialCoinsParallel().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
prefCoinList = getPrefCoin();
if(prefCoinList.size()>0){
for(int i=0;i<prefCoinList.size();i++){
new fetchAltCoinsParallel().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
}
}
public class fetchAltCoinsParallel extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
}
protected String doInBackground(String... params) {
try {
InputStream is = getDataFromURL(params[0]);
if(is!=null){
BufferedReader br = new BufferedReader(new InputStreamReader(is));
synchronized(this){
brList.add(br);
}
}else{
prefCoinNotLoadedTimeOutCount=prefCoinNotLoadedTimeOutCount+1;
}
if(brList.size()==prefCoinList.size()-prefCoinNotLoadedTimeOutCount){
try {
loadAltCoins(getAltCoinDataParallel());
} catch (IOException e) {
e.printStackTrace();
}
maingame.dataReady=true;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String params) {
}
protected void onProgressUpdate(String... progress) {
}
}
答案 0 :(得分:1)
检查AsyncTaskLoader
概念。 API级别11中引入的Android社区以及Honeycomb功能支持此功能。
AsyncTaskLoader
解决了很多限制问题。解决AsyncTask.java的解决方案
官方:https://developer.android.com/reference/android/content/AsyncTaskLoader.html
好示例:https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832
public class JsonAsyncTaskLoader extends AsyncTaskLoader<List<String>> {
// You probably have something more complicated
// than just a String. Roll with me
private List<String> mData;
public JsonAsyncTaskLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
if (mData != null) {
// Use cached data
deliverResult(mData);
} else {
// We have no data, so kick off loading it
forceLoad();
}
}
@Override
public List<String> loadInBackground() {
// This is on a background thread
// Good to know: the Context returned by getContext()
// is the application context
File jsonFile = new File(
getContext().getFilesDir(), "downloaded.json");
List<String> data = new ArrayList<>();
// Parse the JSON using the library of your choice
// Check isLoadInBackgroundCanceled() to cancel out early
return data;
}
@Override
public void deliverResult(List<String> data) {
// We’ll save the data for later retrieval
mData = data;
// We can do any pre-processing we want here
// Just remember this is on the UI thread so nothing lengthy!
super.deliverResult(data);
}
}
答案 1 :(得分:1)
我建议不要使用异步任务,而是建议使用RXJAVA。
以下是Async Task的缺点: https://stackoverflow.com/a/9654445/9100553
使用RxJava将解决这个问题,这是一个完美的博客,它可以解决你使用RxJava的多线程问题。
http://www.nurkiewicz.com/2017/09/idiomatic-concurrency-flatmap-vs.html
(阅读下半部分)flatmap和parallel运算符在你的情况下都很有用。