Android应用程序在加载线程时崩溃

时间:2017-05-25 12:54:54

标签: android multithreading performance thumbnails

我正在尝试在列表视图中加载图像和视频的缩略图。当我正在制作缩略图时,我提供了一个默认缩略图,以便轻松完成任务,因此缩略图制作和加载放在不同的线程中。但问题是应用程序崩溃/退出。

public View getView(final int position, View convertView, ViewGroup parent) 
{

    File file=new File(String.valueOf(filenames[position]));
    if(file.isDirectory()){
        img=R.drawable.folder;
    }

    else{
        img=getImage(filenames[position]);
    }




    ViewHolder viewHolder = null;
    if (convertView == null) {
        LayoutInflater inflator = LayoutInflater.from(getContext());
        convertView = inflator.inflate(R.layout.list_item, null);
        viewHolder = new ViewHolder();
        viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
        viewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
        viewHolder.iv= (ImageView)convertView.findViewById(R.id.imageView);
        viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                myList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
            }
        });
        convertView.setTag(viewHolder);
        convertView.setTag(R.id.textView1, viewHolder.tv);
        convertView.setTag(R.id.checkBox1, viewHolder.cb);
        convertView.setTag(R.id.checkBox1, viewHolder.iv);
    }
    else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.iv.getLayoutParams().height = 80;
    viewHolder.iv.getLayoutParams().width = 80;
    viewHolder.cb.setTag(position); // This line is important.

    final ViewHolder finalViewHolder = viewHolder;


    Thread t2 = new Thread(){

        public void run(){
            if((String.valueOf(filenames[position])).contains(".jpeg")||String.valueOf(filenames[position]).contains(".jpg")||String.valueOf(filenames[position]).contains(".png")||String.valueOf(filenames[position]).contains(".bmp")||String.valueOf(filenames[position]).contains(".webp")||String.valueOf(filenames[position]).contains(".gif")){
                thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[position])), 64, 64);
                finalViewHolder.iv.setImageBitmap(thumb);
            }
            else if((String.valueOf(filenames[position])).contains(".mp4")||String.valueOf(filenames[position]).contains(".mkv")||String.valueOf(filenames[position]).contains(".webm")||String.valueOf(filenames[position]).contains(".3gp")||String.valueOf(filenames[position]).contains(".3gpp")){
                thumb=ThumbnailUtils.createVideoThumbnail(filenames[position].getPath(), MediaStore.Video.Thumbnails.MINI_KIND);
                finalViewHolder.iv.setImageBitmap(thumb);
            }
        }
    };
          finalViewHolder.iv.setImageResource(img);
          finalViewHolder.tv.setText(myList.get(position).getName());
          finalViewHolder.cb.setChecked(myList.get(position).isSelected());
 t2.start();



    return convertView;
}

我尝试过的另一个选择是:

制作两个线程,一个提供默认拇指,另一个提供与上面的t2相同。 没有用。

3 个答案:

答案 0 :(得分:1)

private class SomeTask extends AsyncTask<URL, Integer, Long> {
 protected void doInBackground(String... str) {
       //Do the background stuff here
     }

 }

 protected void onProgressUpdate(Integer... progress) {

 }

 protected void onPostExecute(Long result) {
     //Do the UI stuff here
 }
 }

答案 1 :(得分:1)

我建议您研究这个问题,即将图像从互联网下载到listviews中。但它应该适用于你正在做的事情。

使用图像填充列表视图时,需要注意的事项。 是的,您使用AsyncTask运行图像加载,但您还必须考虑当列表项离开站点并且工作仍在进行时会发生什么。 查看asyncTask中有弱引用的答案,如果不再需要则取消操作。

还有像IonPicasso这样的图书馆为你做的。

Load asynchronous images in listView

答案 2 :(得分:0)

在UI线程上运行。 希望这能帮到你

runOnUiThread(new Runnable() {
        @Override
        public void run() {
           //Your code to run in GUI thread here
        }//public void run() {
});