'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 |