Подтвердить что ты не робот

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

Здесь я вызываю веб-службы во вложенных фрагментах, которые имеют 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, например go to http://pastebin.com/7FDynA05

4b9b3361

Ответ 1

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

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

Спасибо.

Ответ 2

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

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

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

Ответ 3

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

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