Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 进度条冻结几秒钟,然后显示网格视图_Android_Gridview_Progressdialog - Fatal编程技术网

Android 进度条冻结几秒钟,然后显示网格视图

Android 进度条冻结几秒钟,然后显示网格视图,android,gridview,progressdialog,Android,Gridview,Progressdialog,好的,我正在从服务器获取图像,并将它们显示在带有标题的网格视图中。。。我正在为gridview使用baseadapter。。。一切都很好。。。我只有一个问题,当从服务器获取数据并在gridview上填充数据时,我需要显示一个进程对话框。。。 我现在正在使用AsyncTask显示进度对话框,但它会冻结几秒钟(比如10秒钟),然后gridview显示 这是我的baseadapter类: public View getView(int position, View convertView, ViewG

好的,我正在从服务器获取图像,并将它们显示在带有标题的网格视图中。。。我正在为gridview使用baseadapter。。。一切都很好。。。我只有一个问题,当从服务器获取数据并在gridview上填充数据时,我需要显示一个进程对话框。。。 我现在正在使用AsyncTask显示进度对话框,但它会冻结几秒钟(比如10秒钟),然后gridview显示

这是我的baseadapter类:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = listInflater.inflate(R.layout.grid_adapter_view, null);
        holder = new ViewHolder();
        holder.gridImg = (ImageView) convertView
                .findViewById(R.id.grid_item_image);
        holder.gridTitle = (TextView) convertView
                .findViewById(R.id.grid_item_label);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.gridTitle.setText(catItems.get(position).getName());
    try {
        URL url = new URL(catItems.get(position).getImg());
        Bitmap img = BitmapFactory.decodeStream(url.openConnection()
                .getInputStream());
        holder.gridImg.setImageBitmap(img);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        holder.gridImg.setImageResource(R.drawable.no_image);
        e.printStackTrace();
    }
    return convertView;
}

public class ViewHolder {
    ImageView gridImg;
    TextView gridTitle;

}
下面是我使用的异步任务:

mytask = new AsyncTask<Void, Void, Boolean>() {

        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            main_grid.setAdapter(adater);
            if (progress.isShowing()) {
                progress.dismiss();
            }

        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            progress.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            JSONArray jArray = request.getCategories();
            try {
                for (int i = 0; i < jArray.length(); i++) {
                    CategoriesDetail catDetail = new CategoriesDetail();
                    JSONObject jobj = jArray.getJSONObject(i);
                    catDetail.setId(jobj.getString("id").toString());
                    catDetail.setName(jobj.getString("name").toString());
                    catDetail.setImg(jobj.getString("img").toString());
                    catDetail.setOrder(jobj.getString("order").toString());
                    items.add(catDetail);
                }
                adater = new CatGridAdapter(MainActivity.this, items);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                progress.dismiss();
                Toast.makeText(MainActivity.this,
                        "Error: " + e.getMessage(), Toast.LENGTH_LONG)
                        .show();
                return false;
            }

        }

    };
mytask=newasynctask(){
@凌驾
受保护的void onPostExecute(布尔结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
主网格设置适配器(适配器);
if(progress.isShowing()){
进步。解散();
}
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
progress.show();
}
@凌驾
受保护的布尔doInBackground(Void…params){
JSONArray jArray=request.getCategories();
试一试{
for(int i=0;i

请告诉我我做错了什么和哪里…

您正在UI线程上执行网络操作

BitmapFactory.decodeStream(url.openConnection().getInputStream());
看看这个:

编辑: 不要在
getView()
中解码流,只将默认图像设置为
gridImg
并触发
loadBitmap(catItems.get(position.getImg(),holder.gridImg)

public void加载位图(字符串url,图像视图){
新建BitmapWorkerTask(imageView).execute(url);
}
类BitmapWorkerTask扩展了AsyncTask{
私有最终WeakReference imageViewReference;
公共位图工作任务(ImageView ImageView){
//使用WeakReference确保可以对ImageView进行垃圾收集
imageViewReference=新的WeakReference(imageView);
}
//在背景中解码图像。
@凌驾
受保护位图doInBackground(字符串…参数){
返回BitmapFactory.decodeStream(参数[0].openConnection().getInputStream());
}
//完成后,查看ImageView是否仍然存在并设置位图。
@凌驾
受保护的void onPostExecute(位图){
if(imageViewReference!=null&&bitmap!=null){
最终ImageView=imageViewReference.get();
如果(imageView!=null){
设置图像位图(位图);
}
}
}
}

上面的链接中描述了所有这些。你应该认真阅读它,以便更好地理解android中的线程。

请展示如何启动AsyncTask。就像mytask.execute()一样;但我在asynctask adater=new CatGridAdapter(MainActivity.this,items)中声明了网格视图适配器;所以,我应该在BaseAdapter中创建另一个asynctask来解码流吗?无论在何处创建适配器,都会在UI线程中调用getView()方法。我更新了我的答案,为你的问题提供了一个可能的解决方案。。现在我明白了在主UI线程中从不使用getView。。。再次感谢:)可以在
getView()
中设置简单的视图值,但尽量避免在UI线程中使用
BitmapFactory
s
decode*()
方法。@user1602152您应该检查视图的循环是否导致位图的正确加载
public void loadBitmap(String url, ImageView imageView) {
    new BitmapWorkerTask(imageView).execute(url);
}

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(String... params) {
        return BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}