已解决。在嵌套的碎片中运行多个AsyncTasks时暂停线程,使应用程序变慢。

问题描述 投票:14回答:3

在这里,我在嵌套的Fragments中调用网络服务,它有 TabLayoutViewPager 使用 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 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);
            }
        }
    }


}

}

对于完整的堆栈跟踪,如去 http:/pastebin.com7FDynA05

android multithreading user-interface android-fragments android-asynctask
3个回答
2
投票

我知道我迟到了,但我看到你的很多关于处理应用程序的问题,我没有发现任何错误,但我还是想说,请检查你是否调用任何 TypeFace 每次创建一个新的对象,所以评论他们,并运行你的代码,让我知道。

我在很久以前也遇到过这样的问题,只是由于 TypeFace 所以请您试一试我的回答,并告诉我。

谢谢。


1
投票

首先我建议你使用任何网络库,可以是volley或retrofit。因为它们的效率更高,而且它们会在后台并行处理调用,而不需要使用AsyncTask。

你尝试的方式是最复杂的,因为你是并发调用。

如果需要,那么只在resume时进行网络调用。其余的你可以在onCreateView中调用。或者你甚至可以选择在启动时调用。


0
投票

不要做 沉重 活动或片段内的操作,或者每次修改用户界面时,你将不得不管理问题(与异步任务也一样)。

你可以使用异步任务或者库,比如volley,但是要用服务。一个好的教程是 此处.

© www.soinside.com 2019 - 2024. All rights reserved.