从OnPostExecute调用的函数在OnPostExecute执行完成之前不会更新UI

时间:2013-01-05 12:43:50

标签: android android-asynctask

我正在编写一个应用程序,需要从api收集数据并显示它。我动态创建视图并将其添加到linearlayout,如果我使用线程和处理程序,它工作正常,但它在AsyncTask中表现得很奇怪。

以下是我的OnPostExecute

protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        productInfoFetched = productInfoFetched
                + productDetailTempList.size();

        insertItems(productDetailTempList);
        tvLoading.setVisibility(View.GONE);
        if ((productInfoFetched != 0)
                && (productInfoFetched == totalProductCount)
                && (totalProductCount > 10))
            btnSearch.setVisibility(View.VISIBLE);
        else
            btnSearch.setVisibility(View.GONE);
        downloading = false;
        Log.v("in download info task", "Last line of post exe");
    }

insertItems(productDetailTempList);得到应该更新视图的Arraylist。它确实没有显示,直到这一行执行Log.v("在下载信息任务","最后一行exe");

我的insertItem函数如下:

public void insertItems(
        final ArrayList<ProductDetailsDTO> productDetailList2) {
    // infoTaskObj = null;
    infoTaskObj.cancel(true);
    Log.v("AT status", infoTaskObj.getStatus().toString());

    for (final ProductDetailsDTO product : productDetailList2) {

        final Holder holder = new Holder();

        View row = ((LayoutInflater) viewObject).inflate(
                R.layout.product_id, null, false);

        holder.product_image = (ImageView) row
                .findViewById(R.id.product_image);
        holder.product_name = (TextView) row.findViewById(R.id.name);
        holder.sku = (TextView) row.findViewById(R.id.sku);

        holder.price = (TextView) row.findViewById(R.id.price);
        holder.ivOverlay = (ImageView) row.findViewById(R.id.ivOverLay);
        holder.edbuton = (Button) row.findViewById(R.id.ibtnDel);
        lstButton.add(holder.edbuton);
        Log.v(TAG, "before immage set");
        try {
            URL url = new URL(product.url);

            Bitmap bmp = BitmapFactory.decodeStream(url.openConnection()
                    .getInputStream());
            Bitmap btmp = Bitmap.createScaledBitmap(bmp, 80, 80, true);

            holder.product_image.setImageBitmap(btmp);

        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        holder.product_name.setText(product.name);
        holder.sku.setText(product.sku);
        holder.price.setText(product.price);
        if (product.status.equalsIgnoreCase("0")) {
            holder.ivOverlay.setVisibility(View.VISIBLE);
        } else {
            holder.ivOverlay.setVisibility(View.GONE);
        }

        if (ed_flag) {
            holder.edbuton.setVisibility(View.VISIBLE);
            row.setOnClickListener(null);

        } else {
            holder.edbuton.setVisibility(View.GONE);
            row.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    Log.v("Row clicked", "yes");
                    Object obj = view.getTag();
                    String tag = (String) obj;

                    try {
                        // Intent child = new Intent(productListActivity,
                        // ProductThumb.class);
                        if (holder.ivOverlay.getVisibility() == View.VISIBLE)
                            holder.ivOverlay.setVisibility(View.GONE);
                        else
                            holder.ivOverlay.setVisibility(View.VISIBLE);

                        Intent child = new Intent(productListActivity
                                .getParent(),
                                ProductCompleteDetailActivity.class);
                        child.putExtra("ProductDetailDTOList",
                                productDetailList);
                        child.putExtra("ProductDetailDTO", product);
                        productListActivity.startActivity(child);

                        // Intent intent = new
                        // Intent(productListActivity.getParent(),ProductCompleteDetailActivity.class);
                        // TabGroupActivity parentActivity =
                        // (TabGroupActivity)
                        // productListActivity.getParent();
                        // intent.putExtra("ProductDetailDTO", mData);
                        // parentActivity.startChildActivity("DisplayDetail",
                        // intent);

                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                    // Toast.makeText(parent.getContext(),
                    // "Product id: " + mData.get(position).productId,
                    // Toast.LENGTH_SHORT).show();
                }
            });

        }
        holder.edbuton.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub
                String status;
                status = product.status;
                Log.v("Id of product clicked in array list",
                        product.productId);
                Log.v("Status of product", status);
                if (status.equalsIgnoreCase("1")) {
                    disableProduct(product.productId, "0");
                    product.status = "0";
                } else {
                    disableProduct(product.productId, "1");
                    product.status = "1";
                }
            }
        });

        llMainView.addView(row);
        scroll = true;
    }

}

我认为每个项目应该在llMainView.addView(行)时开始显示;这一行执行。但事实并非如此。它等待OnPostExecute完成,然后所有项目一起显示。我在这里弄错了吗?

0 个答案:

没有答案