在片段中加载ListView时的新线程

时间:2015-07-29 12:42:06

标签: android multithreading android-fragments progressdialog

我有一个Activity,它持有一个TabHolder。每个标签都是片段。

其中一个标签有一个ListView,应该用照片和文字来实现。问题是,当我点击选项卡时,UI需要一段时间才能加载,因为我必须通过URI获取照片,将位图的大小调整为ListView中适配器中的ImageView,然后显示它。我想将照片加载到一个帖子中,并在照片加载时向用户显示ProgressDialog。但我不知道在哪里!如果我在适配器中的getView方法中执行它,它开始表现得很奇怪,因为它被调用的次数与数组中的照片一样多...尝试在片段内的OnCreateView()中执行此操作:

adapter=new FotoAdapter(getActivity(), arrayFotos);
    final ProgressDialog dialog=ProgressDialog.show(getActivity(), getString(R.string.onemoment), getString(R.string.fotoloading));
    handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what==1){
                dialog.dismiss();
            }
        }
    };

    Thread thread=new Thread(new Runnable() {
        @Override
        public void run() {
            listaFotos.setAdapter(adapter);
            Message message=new Message();
            message.what=1;
            handler.sendMessage(message);
        }
    });
    thread.start();

...但它没有做任何事情,没有显示对话框,并且花费相同的时间向用户呈现UI。

我怎么能实现它?

谢谢。

编辑:

建议之后,试过毕加索。在这里你可以看到两种方法,毕加索和没有它:

String path=fotos.get(position).getFotoPath();
//Picasso.with(c).load(path).resize(80, 80).into(holder.foto);
Bitmap foto= BitmapFactory.decodeFile(path);
int bmWidth=foto.getHeight();
int bmHeight=foto.getHeight();
int ivWidth;
int ivHeigth;
int new_width;
int new_height;
ivWidth=dpToPx(80);
new_width=ivWidth;
new_height = (int) Math.floor((double) bmHeight *( (double) new_width / (double) bmWidth));
Bitmap newbitMap = Bitmap.createScaledBitmap(foto, new_width, new_height, true);
holder.lat.setText(fotos.get(position).getLatitud().toString());
holder.lon.setText(fotos.get(position).getLongitud().toString());
holder.foto.setImageBitmap(newbitMap);

使用Picasso,我无法在ImageView中看到图像。

2 个答案:

答案 0 :(得分:1)

一个。不要在不是UI线程的线程上设置任何视图(就像你做的那样)。

B中。使用Picasso进行图像加载或其他一些库,不要重新发明轮子。 lib将在后台线程上执行所有加载,因此您不需要任何进度条(可能)。

按照这两个步骤操作,您的代码应该可以正常工作。

编辑: 问题可能是你的路径,我用picasso来加载urls而不是内部存储。打印你的路径并看一看。

答案 1 :(得分:0)

如果有人试图从设备加载图片,并且遇到与我相同的问题,这是使用Picasso和图像的正确语法:

prefKey