活动卡在Looper.java中

时间:2016-10-10 10:42:20

标签: android

我的应用程序之一的活动遇到了问题;问题似乎是asynk-task,它从服务器获取信息并使用该数据在视图中生成n个元素的列表,这会使活动卡在白色加载屏幕中而不是渲染视图。 / p>

没有崩溃或错误。

我可以按回按钮并返回上一个活动(不冻结)。

Android监视器显示无cpu使用情况。

这是代码。我在onCreate()

的末尾调用
new AsyncTask() {
            @Override
            protected void onPreExecute() {
                mProgressDialog.show();
            }

            @Override
            protected Object doInBackground(Object[] params) {


                Document dom = null;

                Detalle detalle= getIntent().getParcelableExtra("pedido");
                try {
                    dom=DetalleToXml.getDom(detalle);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return dom;
            }

            protected void onPostExecute(Object o) {
                Document dom = (Document)o;
                mProgressDialog.dismiss();
                TableLayout t = (TableLayout) contentView.findViewById(R.id.grid_layout_pedido);
                t.removeAllViewsInLayout();

                final NodeList rows = dom.getElementsByTagName("row");

                if(rows.getLength() == 0) {
                    Toast.makeText(DetallesPedido.this, "La búsqueda no ha tenido resultados.", Toast.LENGTH_SHORT).show();
                }else{
                    for(int i = 0; i < rows.getLength(); i++){
                        Element e = (Element)rows.item(i);
                        LayoutInflater inflater = LayoutInflater.from(getBaseContext());

                        String rowid = UtilesDom.getValue(e, "rowid");
                        String articulo = UtilesDom.getValue(e, "articulo");
                        String precio_venta = UtilesDom.getValue(e, "precio_venta");
                        String cantidad = UtilesDom.getValue(e, "cantidad");
                        String descripcion = UtilesDom.getValue(e, "descripcion");


                        LinearLayout bigRow=(LinearLayout)inflater.inflate(R.layout.pedido_detalle,null);

                        TextView tv=(TextView) bigRow.findViewById(R.id.detalle_row_textView1);
                        tv.setText(articulo);
                        tv=(TextView) bigRow.findViewById(R.id.detalle_row_textView3);
                        tv.setText(precio_venta);
                        tv=(TextView) bigRow.findViewById(R.id.detalle_row_textView2);
                        tv.setText(cantidad);
                        tv=(TextView) bigRow.findViewById(R.id.detalle_row_textView4);
                        tv.setText(descripcion);

                        try {
                            bigRow.setId(Integer.parseInt(rowid));
                        } catch (Exception e2) {
                            e2.printStackTrace();
                        }
                        bigRow.setTag(articulo);

                        bigRow.setOnClickListener(new View.OnClickListener() {
                                                      @Override
                                                      public void onClick(View v) {
                                                          String codigo = (String) v.getTag();
                                                          final Context context = v.getContext();
                                                          final int rowid = v.getId();

                                                          Intent intent = new Intent(context, DetalleFicha.class);
                                                          Bundle b = new Bundle(3);
                                                          b.putInt("rowid", rowid);
                                                          b.putInt("operation",UtilesABM.UPDATE);
                                                          b.putString("caller","DetallesPedido");
                                                          intent.putExtras(b);
                                                          intent.putExtra("pedido",getIntent().getParcelableExtra("pedido"));
                                                          loaded = false;
                                                          startActivity(intent);
                                                      }
                                                  }
                        );
                        //UtilesViews.setDefaultPadding(tv);
                        t.addView(bigRow);
                    }
                }
                super.onPostExecute(o);
            }
        }.execute(query);

通过调试,我可以在Loop.java之后立即到达execute()班级,并且卡在哪里。 有关如何解决问题或问题原因的任何想法?

1 个答案:

答案 0 :(得分:0)

您正在执行性价比非常高的通话

LinearLayout bigRow=(LinearLayout)inflater.inflate(R.layout.pedido_detalle,null);

这可能需要花费太多时间,并且因为你在onPostExecute调用中执行它,这是在主线程上调用的,所以如果行数很大且app变得没有响应,主线程将被阻塞

解决方法是,您可以使用回收站视图