1

リストビューのテキストの横に表示するために画像を読み込もうとしています。asynctask がないとスクロールがひどいので、それを実装しようとしています。残念ながら、私のコードでは onPostExecute() で null ポインター エラーが発生しており、その理由がわかりません。私のコードは次のとおりです。

class LoadImage extends AsyncTask<Object, Void, Bitmap>{

    private ImageView imv;
    private Object imageViewHolder;
    private String position;
    private Object path;

    public LoadImage(ImageView imv, String _position) {
        Log.w("MyApp", "creating LoadImage");
        this.imv = imv;
        Log.w("MyApp", "got image view");
        path = imv.getTag();
        Log.w("MyApp", "Got Imageview Path");
        position = _position;
        Log.w("MyApp", "LoadImage created");
    }

    @Override
    protected Bitmap doInBackground(Object... params) {
        Log.w("MyApp", "in doInBackground");
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        Log.w("MyApp", "made bitmap factory");

        Bitmap bm = null;

        Log.w("MyApp", "Getting URL ID");
        File dir = new File(PATH + position);
        Log.w("MyApp", "Have URL ID");

        if(dir.isDirectory()){
            Log.w("MyApp","Dir is a directory");

            File header = new File(dir.getAbsolutePath() + "/title");
            Log.w("MyApp", "Checking for title");
            if(header.isFile()){
                bm = BitmapFactory.decodeFile(header.getAbsolutePath(), options);
            }

            if(bm!=null){
                Log.w("MyApp", "Title is good");
            }else{
                Context c = ReadingList.this;
                bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery);
            }
        }else{
            Log.w("MyApp", "Dir Not Directory");
            Context c = ReadingList.this;
            bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery);
        }


        return bm;
    }
    @Override
    protected void onPostExecute(Bitmap result) {
        if (!imv.getTag().equals(path)) {
            Log.w("MyApp", "Not setting images");
            return;
        }

        if(result != null && imv != null){
            Log.w("MyApp", "setting bitmap");
            imv.setImageBitmap(result);
        }else{
            Log.w("MyApp", "Nothing happened");
        }
    }

}

私が戦っている問題は、リサイクルされたビューと一緒にビットマップをリサイクルできないことです。このサイトでいくつかの例を見てきましたが、なぜこれが機能しないのかわかりません。この質問への回答から多くのコードを借用しました。onPostExecute はログに何も入力せず、すぐにクラッシュしません。クラッシュするのに約2分かかるようです。画像は SD カードから取り出されているため、クラッシュするかどうかを判断するのに時間がかかる理由がわかりません。

in doInBackground
made bitmap factory
Getting URL ID
Have URL ID
Dir is a directory
Checking for title
Title is good
in doInBackground
made bitmap factory
getting URL ID
Have URL ID
Dir is a directory
Checking title
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:305)
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:1)

この後、最初の 7 行を複数回繰り返しますが、アプリがクラッシュし、何かを実行するかどうかわかりません。ただし、onPostExecute が再び呼び出されることはないようです。

参考のため:

304: if (!imv.getTag().equals(path)) {
305:    Log.w("MyApp", "Not setting images");
306:    return;
307: }
4

1 に答える 1

1

自分に合った解決策を見つけました。私はaQueryを使用し、提供されたファイルから shouldDelay と async セット イメージを使用しました。

if(header.isFile() && !aq.shouldDelay(position, convertView, parent, 
   header.getAbsolutePath())){
     bm = BitmapFactory.decodeFile(header.getAbsolutePath(), options);
     showcase.setImageBitmap(bm);
 } else {                    
     showcase.setImageResource(R.drawable.missing_image);
 }
于 2012-04-30T16:59:28.603 に答える