'Suspending threads while running multiple AsyncTasks in nested fragments and it makes app slow

Here I'm calling web services in nested Fragments which has TabLayout and ViewPager using AsyncTask. I've tried AsyncTasks by calling them all in onResume method of each Fragment as:

new FetchAllData(getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

and

new FetchAllData(getActivity()).execute();

Everything is fine but I get lots of issues:

  • App stops working without any dialog but it shows suspending all threads in logcat.

  • When we come on this fragment(which has nested tablayouts and viewpagers) from another activity which is showing in image, everything gets blank except Toolbar for 3 to 5 seconds. And all of sudden they come with complete data.

  • When we call this fragment from another fragment of same activity it freezes there and this fragments gets opened all of sudden there.

I hope you got my all issues if not please inform to me.

Stacktrace is:

1-29 12:10:49.580 10853-10863/com.cws.advisorymandi W/art: Suspending all threads took: 10.409ms
 01-29 12:10:49.707 10853-10853/com.cws.advisorymandi D/cr_Ime: [InputMethodManagerWrapper.java:27] Constructor
 01-29 12:10:49.711 10853-10853/com.cws.advisorymandi D/cr_Ime: [ImeAdapter.java:241] attach
 01-29 12:10:49.711 10853-10853/com.cws.advisorymandi W/art: Attempt to remove local handle scope entry from IRT, ignoring
 01-29 12:10:49.716 10853-10853/com.cws.advisorymandi W/AwContents: onDetachedFromWindow called when already detached. Ignoring
 01-29 12:10:49.717 10853-10853/com.cws.advisorymandi D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: false
 01-29 12:10:49.726 10853-10853/com.cws.advisorymandi W/art: Attempt to remove local handle scope entry from IRT, ignoring
 01-29 12:10:49.726 10853-10853/com.cws.advisorymandi W/art: Attempt to remove local handle scope entry from IRT, ignoring
 01-29 12:10:49.812 10853-10853/com.cws.advisorymandi D/cr_Ime: [ImeAdapter.java:241] attach
 01-29 12:10:49.832 10853-10853/com.cws.advisorymandi D/cr_Ime: [ImeAdapter.java:241] attach
 01-29 12:10:49.833 10853-10853/com.cws.advisorymandi I/Choreographer: Skipped 58 frames!  The application may be doing too much work on its main thread.
 01-29 12:10:50.075 10853-10853/com.cws.advisorymandi W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 10853
 01-29 12:10:50.610 10853-10863/com.cws.advisorymandi W/art: Suspending all threads took: 43.636ms
 01-29 12:10:50.621 10853-10853/com.cws.advisorymandi I/Ads: Scheduling ad refresh 60000 milliseconds from now.
 01-29 12:10:50.630 10853-10853/com.cws.advisorymandi I/Ads: Ad finished loading.

Fragment.java

public class IndicesFragment extends android.support.v4.app.Fragment implements SwipeRefreshLayout.OnRefreshListener {
public static String imagepath = null;
public static FetchAllData myTask;
static ArrayList<EquityDetails> catListDao = new ArrayList<EquityDetails>();
static ArrayList<EquityDetails> catListDao1 = new ArrayList<EquityDetails>();
static int count = 0;
static int count1 = 0;
ListView list;
ImageView progressBar;
View view;
Activity act;
AdvisorsAdapter adapter;
TextView empty_text;
AnimatorSet set;
JSONArray jsonArray;
SwipeRefreshLayout swipeRefreshLayout;
private boolean isViewShown = false;

public static IndicesFragment newInstance() {
    return new IndicesFragment();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        isViewShown = true;
        if (adapter != null) {
            adapter.filter("");
        }
    } else {
        isViewShown = false;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.equity_activity, container, false);
    act = this.getActivity();
    Constants.check_fragment_visible = 1;
    count++;
    setHasOptionsMenu(true);
    list = (ListView) view.findViewById(R.id.list_equity);
    empty_text = (TextView) view.findViewById(R.id.empty);
    swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
    progressBar = (ImageView) view.findViewById(R.id.progressBar);
    set = (AnimatorSet) AnimatorInflater.loadAnimator(getActivity(), R.animator.fadein);
    set.setTarget(progressBar);
    progressBar.setVisibility(View.GONE);
    if (Utils.isNetworkAvailable(getActivity())) {
        if (catListDao.size() > 0) {
            adapter = new AdvisorsAdapter(act, R.layout.custom_equity, catListDao, 0);
            list.setAdapter(adapter);
        } else {
            if (!isViewShown) {
                new FetchAllData(getActivity(), 3).execute();
            }
        }
    } else {
        CustomToast toast = new CustomToast(getActivity(), "There is no internet connection!");
    }
    swipeRefreshLayout.setOnRefreshListener(this);
    return view;
}


public void onActivityCreated(Bundle savedInstanceState1) {
    super.onActivityCreated(savedInstanceState1);
}

@Override
public void onResume() {
    super.onResume();
    Constants.check_fragment_visible = 1;
    if (Constants.check_reload) {
        if (Utils.isNetworkAvailable(getActivity())) {
            new FetchAllData(getActivity(), 3).execute();
        } else {
            CustomToast toast = new CustomToast(getActivity(), "There is no internet connection!");
        }
    }
    if (adapter != null) adapter.notifyDataSetChanged();

}

@Override
public void onRefresh() {
    if (Utils.isNetworkAvailable(getActivity())) {
        new FetchAllData(getActivity(), 3).execute();
    } else {
        CustomToast toast = new CustomToast(getActivity(), "There is no internet connection!");
    }
}


public void doChange(String queryText) {
    if (queryText != null) {
        if (adapter != null)
            adapter.filter(queryText);
    }
}

public void parseJSON(String result) {
    if (result != null) {
        JSONObject jsonObject;
        try {
            catListDao = new ArrayList<EquityDetails>();
            jsonObject = new JSONObject(result);
            jsonArray = jsonObject.getJSONArray("list");

            Log.d("Length ", "" + jsonArray.length());
            for (int i = 0; i < jsonArray.length(); i++) {
                EquityDetails allDirectory = new EquityDetails();
                allDirectory.setEntry_value(jsonArray.getJSONObject(i).getString("entry"));
                String value1 = jsonArray.getJSONObject(i).getString("entry");
                String value2 = jsonArray.getJSONObject(i).getString("tgt_1");
                allDirectory.setSerial_value(jsonArray.getJSONObject(i).getString("sl"));
                allDirectory.setTg_value1(jsonArray.getJSONObject(i).getString("tgt_1"));
                allDirectory.setTg_value2(jsonArray.getJSONObject(i).getString("tgt_2"));
                allDirectory.setPosted_by(jsonArray.getJSONObject(i).getString("posted_by"));
                allDirectory.setMainTitle_value(jsonArray.getJSONObject(i).getString("script"));
                allDirectory.setMain_subTitle_value(jsonArray.getJSONObject(i).getString("exchange"));
                allDirectory.setRating_value(jsonArray.getJSONObject(i).getString("rating"));
                allDirectory.setReview_value(jsonArray.getJSONObject(i).getString("review"));
                imagepath = jsonArray.getJSONObject(i).getString("advisor_image");
                Log.d("Comminh Image ", "" + jsonArray.getJSONObject(i).getString("advisor_image"));
                allDirectory.setImage1(jsonArray.getJSONObject(i).getString("advisor_image"));
                allDirectory.setImage2(jsonArray.getJSONObject(i).getString("script_image"));
                allDirectory.setBuy(jsonArray.getJSONObject(i).getString("buy_sentiment"));
                allDirectory.setSell(jsonArray.getJSONObject(i).getString("sell_sentiment"));
                allDirectory.setRecommend(jsonArray.getJSONObject(i).getString("recommendation"));
                allDirectory.setPosted_date(jsonArray.getJSONObject(i).getString("posted_date"));
                allDirectory.setCall_id(jsonArray.getJSONObject(i).getString("call_id"));
                allDirectory.setExpiry_date(jsonArray.getJSONObject(i).getString("expiry_date"));
                allDirectory.setBroker_name(jsonArray.getJSONObject(i).getString("name"));
                allDirectory.setCall_detail(jsonArray.getJSONObject(i).getString("detail"));
                allDirectory.setProgress_indicator(0);
                catListDao.add(allDirectory);
            }
            catListDao1 = catListDao;
            adapter = new AdvisorsAdapter(act, R.layout.custom_equity, catListDao, 0);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

}

public class FetchAllData extends AsyncTask<Void, Void, String> {
    ProgressDialog pDialog;
    int typeId;
    private Context cont;

    public FetchAllData(Context con, int typeId) {
        // TODO Auto-generated constructor stub
        this.cont = con;
        this.typeId = typeId;
        Log.d("Constructor Called", "yes");
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        if (!swipeRefreshLayout.isRefreshing()) {
            if (progressBar != null) {
                progressBar.setVisibility(View.VISIBLE);
                set.start();
            }
        }
    }


    @Override
    protected String doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return getString();
    }

    private String getString() {
        // TODO Auto-generated method stub

        URL obj = null;
        HttpURLConnection con = null;
        try {
            obj = new URL(Constants.AppBaseUrl + "/call_listing/" + typeId);
            String userPassword = "rickmams" + ":" + "advisor11";
            String header = "Basic " + new String(android.util.Base64.encode(userPassword.getBytes(), android.util.Base64.NO_WRAP));
            con = (HttpURLConnection) obj.openConnection();
            con.addRequestProperty("Authorization", header);
            con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
            con.setRequestMethod("POST");

            // For POST only - BEGIN
            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();

            os.flush();
            os.close();
            // For POST only - END

            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                Log.i("TAG", response.toString());
                parseJSON(response.toString());
                return response.toString();

            } else {
                Log.i("TAG", "POST request did not work.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
        return null;
    }


    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (getActivity() == null)
            return;
        if (swipeRefreshLayout.isRefreshing()) {
            swipeRefreshLayout.setRefreshing(false);
        }
        if (result != null) {
            if (progressBar != null) {
                list.setAdapter(adapter);
                //pDialog.dismiss();
                if (progressBar != null) {
                    set.end();
                    if (progressBar.getVisibility() == View.VISIBLE)
                        progressBar.setVisibility(View.GONE);
                }
                if (jsonArray.length() != 0) {
                    empty_text.setVisibility(View.GONE);
                } else empty_text.setVisibility(View.VISIBLE);
            }
        }
    }


}

}

For complete stacktrace like go to http://pastebin.com/7FDynA05



Solution 1:[1]

I know I'm late but as I saw your lots of questions regarding of processing of app I found no error in anything but still I wanna say please check if you're calling any TypeFace by creating a new object each time so comment them and run your code.

Solution 2:[2]

Firstly i would recommend you to use any network library can be volley or retrofit. As they are more efficient and they will handle the call in background and parallely without using AsyncTask.

The way you are trying is most sophisticated, as are you calling concurrently.

If it's required, then only make network call on resume. Rest you can call it in onCreateView. Or you can even choose to call it in on start.

Solution 3:[3]

Don't do heavy operation within activities or fragments, or every time you modify the user interface you will have to manage problems (with async task too).

You can use asynch task or library such as volley, but with services. A good tutorial is here.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 General Grievance
Solution 2
Solution 3 xcesco