Множественная асинхронная задача, зависающая от приложения

В моем приложении Android я использую несколько AsyncTask, используя THREAD_POOL_EXECUTOR, который заставляет задачи запускаться параллельно. Когда-то приложение зависает. Ниже приведен код, который я использую.

  • Не могли бы вы дать мне знать, как правильно настроить, чтобы избежать каких-либо проблем с зависанием?
  • Как найти точку, в которой приложение висит?

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

    }

Подробности темы введите описание изображения здесь

Ответ 1

Проверьте концепцию AsyncTaskLoader. Эта функция поддерживается сообществом Android, представленным на уровне API 11 наряду с функциями 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);
    }
}

Ответ 2

Вместо использования Async Tasks я рекомендую использовать RXJAVA для этой цели.

Вот недостаток, данный для задачи Async: fooobar.com/info/67584/...

Использование RxJava решит эту проблему, вот идеальный блог, который может решить вашу проблему Multi Threading с помощью RxJava.

http://www.nurkiewicz.com/2017/09/idiomatic-concurrency-flatmap-vs.html

(Прочитайте вторую половину). В вашем случае были бы полезны как плоские, так и параллельные операторы.