悬挂应用程序的多个异步任务

时间:2018-01-18 03:50:04

标签: android android-asynctask threadpoolexecutor

在我的Android应用程序中,我使用THREAD_POOL_EXECUTOR使用多个AsyncTask,这使得任务并行运行。有时应用程序挂起。以下是我使用的代码。

  1. 能告诉我如何微调以避免任何悬挂问题吗?
  2. 如何找到应用挂起的点?

    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) {
    }
    

    }

  3. 主题详情 enter image description here

2 个答案:

答案 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运算符在你的情况下都很有用。