膨胀数据和显示视图需要很长时间

时间:2014-10-23 12:14:45

标签: android android-fragments

我在申请中使用了fragemnts。该片段包含有关我从web中获取的对象的一些详细信息。因此布局有很多项目,我需要对它们进行全面设置以设置数据。我使用asynchtask从Web加载数据,然后使视图的主片段可见。这是我的片段oncreate方法的代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_app_detail,
                container, false);

        final LayoutInflater inflaterFinal = inflater;

        // Rating View --------------------------------------
        final LinearLayout diagramContainers = (LinearLayout) rootView
                .findViewById(R.id.lyt_app_details_rating_container_diagrams);

        diagramContainers.post(new Runnable() {
            public void run() {
                try {

                    // initialize helper variables------------
                    int width_fiveStartRateBar = 0;

                    int maxRateCount = 0;
                    for (int i = 0; i < 5; i++) {
                        maxRateCount = Math.max(maxRateCount,
                                app.getRateCounts()[i]);
                    }

                    int width_rateCountTxt = 0;
                    // initialize layout objects--------------
                    for (int j = 4; j >= 0; j--) {
                        LinearLayout diagramLyt = (LinearLayout) inflaterFinal
                                .inflate(
                                        R.layout.lyt_app_details_rating_diagram,
                                        null, false);

                        // star rate bar
                        RatingBar starRateBar = (RatingBar) diagramLyt
                                .findViewById(R.id.lyt_app_details_rating_diagram_rb_starbar);
                        starRateBar.setNumStars(j + 1);
                        starRateBar.setRating(j + 1);
                        starRateBar.measure(0, 0);
                        if (j == 4)
                            width_fiveStartRateBar = starRateBar
                                    .getMeasuredWidth();
                        else {
                            int p = width_fiveStartRateBar
                                    - starRateBar.getMeasuredWidth();
                            diagramLyt.setPadding(p, 0, 0, 0);
                        }

                        // rate Count txt
                        TextView rateCountTxt = (TextView) diagramLyt
                                .findViewById(R.id.lyt_app_details_rating_digram_txt_count);
                        rateCountTxt.setText(String.valueOf(app
                                .getRateCounts()[j]));
                        rateCountTxt.measure(0, 0);
                        width_rateCountTxt = rateCountTxt
                                .getMeasuredWidth();

                        // color bar
                        int totalWidth_colorBar = diagramContainers
                                .getWidth()
                                - (width_fiveStartRateBar + dpToPixel(5)
                                        + dpToPixel(5) + width_rateCountTxt);
                        float barWith = (totalWidth_colorBar * app
                                .getRateCounts()[j]) / maxRateCount;
                        LinearLayout bar = (LinearLayout) diagramLyt
                                .findViewById(R.id.lyt_app_details_rating_diagram_linear_colorbar);
                        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                (int) barWith, dpToPixel(12));
                        lp.setMargins(dpToPixel(5), 0, dpToPixel(5), 0);
                        bar.setLayoutParams(lp);
                        if (j == 4)
                            bar.setBackgroundResource(R.drawable.bg_colorbar_five);
                        else if (j == 3)
                            bar.setBackgroundResource(R.drawable.bg_colorbar_four);
                        else if (j == 2)
                            bar.setBackgroundResource(R.drawable.bg_colorbar_three);
                        else if (j == 1)
                            bar.setBackgroundResource(R.drawable.bg_colorbar_two);
                        else
                            bar.setBackgroundResource(R.drawable.bg_colorbar_one);

                        diagramContainers.addView(diagramLyt);
                    }

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });


        // Thumb-nail Images Gallery ------------------------
        LinearLayout gallery = (LinearLayout) rootView
                .findViewById(R.id.gallery1);

        //gallery.post(new Runnable() {

        //  @Override
        //  public void run() {
                for (int i = 0; i < app.getThumbShotsLink().size(); i++) {

                    // get URL
                    final String tURL = app.getThumbShotsLink().get(i);
                    final String rURL = app.getScreenShotsLinks().get(i);

                    // create image view
                    ImageView v = new ImageView(getActivity());

                    // add layout parameters
                    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                            dpToPixel(115), dpToPixel(175));
                    lp.setMargins(0, 0, dpToPixel(3), 0);
                    v.setLayoutParams(lp);

                    // set image
                    if (i % 2 == 0)
                        v.setImageResource(R.color.light_green);
                    else
                        v.setImageResource(R.color.dark_green);

                    // listen to click
                    v.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            // TODO: OPEN FULL SCREEN IMAGE PAGE
                            Toast.makeText(getActivity(), tURL, Toast.LENGTH_LONG)
                                    .show();
                        }
                    });

                    // add to view
                    gallery.addView(v);
                }
        //  }
        //});



        // Similar Apps -----------------------------------
        LinearLayout v = (LinearLayout) rootView
                .findViewById(R.id.app_details_llyt_similars);
        GridView similarGrid = (GridView) v
                .findViewById(R.id.lyt_app_similar_grid);
        similarGrid.setAdapter(new AppGridAdapter(app.getSimilarApps(),
                getActivity()));

        // Developer Apps ----------------------------------
        View v2 = (View) rootView
                .findViewById(R.id.app_details_llyt_developer_apps);
        GridView developerGrid = (GridView) v2
                .findViewById(R.id.lyt_app_similar_grid);
        developerGrid.setAdapter(new AppGridAdapter(app.getDeveloperApps(),
                getActivity()));

        return rootView;
    }

问题是应用程序加载布局并将数据设置为大约需要5秒。我正在寻找一种方法,我如何膨胀布局并将数据设置为它们,以便应用程序不会锁定5秒钟。

1 个答案:

答案 0 :(得分:0)

我不确定完全理解您的代码。 你想用以下几行做什么?

diagramContainers.post(new Runnable() { ...

此调用不会创建新线程以在后台执行作业。它只会在onCreate()结束后执行。 Maibe您的一些性能问题来自于此。

您创建新视图以将其添加到父布局的方式对我来说似乎也是错误的。你应该永远不必创建这么多的视图。您应该使用ViewGroup / Adapter模式(参见this链接)。适配器将在内部管理视图,并在必要时重用视图。这可以大大提高你的表现。

编辑:

您可以使用多个listview。你可以拥有每种类型的项目(一个用于图表,一个用于缩略图等...)。 无论如何,它似乎在您的diagramContainers部分中,您总是在膨胀相同数量的视图。在这种情况下,为什么不在xml中创建这些视图。这样可以证明你的表现。

尝试发布你的R.layout.fragment_app_detail布局,以便我能更好地理解你在做什么。