Приостановка потоков при запуске нескольких AsyncTasks во вложенных фрагментах и ​​медленное приложение

Здесь я TabLayout веб-службы во вложенных фрагментах, которые имеют TabLayout и ViewPager используя AsyncTask . Я пробовал AsyncTasks , вызывая их все в методе onResume каждого Fragment как:

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

а также

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

Все в порядке, но у меня много проблем

  • Приложение перестает работать без какого-либо диалога, но оно показывает suspending all threads в logcat.

  • Когда мы приходим к этому фрагменту (который имеет вложенные tablayouts и viewpagers) из другого действия, которое отображается на изображении, все становится пустым, за исключением панели инструментов в течение 3-5 секунд. И внезапно они приходят с полными данными.

  • Когда мы называем этот фрагмент из другого фрагмента той же активности, он замерзает там, и эти фрагменты вскрываются внезапно там.

Надеюсь, вы получили мои проблемы, если не сообщите мне.

Stacktrace:

 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 qeryText) { if (qeryText != null) { if (adapter != null) adapter.filter(qeryText); } } 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); } } } } } 

Для полного stacktrace, как перейти на http://pastebin.com/7FDynA05

Solutions Collecting From Web of "Приостановка потоков при запуске нескольких AsyncTasks во вложенных фрагментах и ​​медленное приложение"

Я знаю, что опаздываю, но поскольку я видел ваши вопросы относительно обработки приложения, я не обнаружил ошибки ни в чем, но все же хочу сказать, пожалуйста, проверьте, вызываете ли вы какой-либо TypeFace каждый раз, создавая новый объект, чтобы комментировать их и Запустите свой код и дайте мне знать.

Я также столкнулся с таким типом проблемы давно, просто из-за того, что TypeFace пожалуйста, попробуйте мой ответ и дайте мне знать.

Благодарю.

Во-первых, я бы рекомендовал вам использовать любую сетевую библиотеку, которая может быть волейбольной или модифицированной. Поскольку они более эффективны, и они будут обрабатывать вызов в фоновом режиме и параллельно, не используя AsyncTask.

То, как вы пытаетесь, является наиболее сложным, как вы называете одновременно.

Если это необходимо, то только сетевой вызов возобновляется. Покой вы можете вызвать его в onCreateView. Или вы даже можете называть его в начале.

Не выполняйте тяжелую работу в рамках действий или фрагментов, или каждый раз, когда вы изменяете пользовательский интерфейс, вам придется управлять проблемами (с асинхронной задачей тоже).

Вы можете использовать асинхронную задачу или библиотеку, такую ​​как залп, но с услугами. Хороший учебник здесь .