我的应用程序之一的活动遇到了问题;问题似乎是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()
班级,并且卡在哪里。
有关如何解决问题或问题原因的任何想法?
答案 0 :(得分:0)
您正在执行性价比非常高的通话
LinearLayout bigRow=(LinearLayout)inflater.inflate(R.layout.pedido_detalle,null);
这可能需要花费太多时间,并且因为你在onPostExecute调用中执行它,这是在主线程上调用的,所以如果行数很大且app变得没有响应,主线程将被阻塞
解决方法是,您可以使用回收站视图