iap*_*ker 11 android android-asynctask threadpoolexecutor
在我的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) {
}
Run Code Online (Sandbox Code Playgroud)
}
检查这个AsyncTaskLoader
概念。此功能由 API 级别 11 中引入的 Android 社区以及 Honeycomb 功能支持。
AsyncTaskLoader
解决了 AsyncTask.java 的许多限制和解决方案
官方:https://developer.android.com/reference/android/content/AsyncTaskLoader.html
\n\n好的示例:https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832
\n\npublic class JsonAsyncTaskLoader extends AsyncTaskLoader<List<String>> {\n // You probably have something more complicated\n // than just a String. Roll with me\n private List<String> mData;\n\n public JsonAsyncTaskLoader(Context context) {\n super(context);\n }\n\n @Override\n protected void onStartLoading() {\n if (mData != null) {\n // Use cached data\n deliverResult(mData);\n } else {\n // We have no data, so kick off loading it\n forceLoad();\n }\n }\n\n @Override\n public List<String> loadInBackground() {\n // This is on a background thread\n // Good to know: the Context returned by getContext()\n // is the application context\n File jsonFile = new File(\n getContext().getFilesDir(), "downloaded.json");\n List<String> data = new ArrayList<>();\n // Parse the JSON using the library of your choice\n // Check isLoadInBackgroundCanceled() to cancel out early\n return data;\n }\n\n @Override\n public void deliverResult(List<String> data) {\n // We\xe2\x80\x99ll save the data for later retrieval\n mData = data;\n // We can do any pre-processing we want here\n // Just remember this is on the UI thread so nothing lengthy!\n super.deliverResult(data);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
616 次 |
最近记录: |