Drawables不会使用AsyncTask加载

时间:2013-12-03 00:26:42

标签: android android-asynctask

我有queryAppIcon()方法,用于在数组appIconDrawable中查询和存储图像。但是,我只会弹出图像应该弹出的空白。如果我发布任何其他相关代码,请告知我们

这是ViewActivity中的相关代码:

// global vars
final Drawable[] appIconDrawable = null;
int i;

public Drawable[] queryAppIcon() throws ParseException, IOException {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("AndroidStoreContent");
    query.whereExists("appIcon");
    List<ParseObject> ParseResult = query.find();
    // Drawable array
    appIconDrawable = new Drawable[ParseResult.size()];

    for (i = 0; i < ParseResult.size(); i++) {
        ParseFile pf = (ParseFile) ParseResult.get(i).get("appIcon");
        startDownload(pf);
    }
    return appIconDrawable;
}

public void startDownload(ParseFile pf) {
    new DownloadImageTask(this).execute(pf);
}

public class DownloadImageTask extends AsyncTask<ParseFile, Void, Drawable> {

    private AsyncResponse ar;

    DownloadImageTask(AsyncResponse ar) {
        this.ar = ar;
    }

    @Override
    protected Drawable doInBackground(ParseFile... pf) {
        return fetchDrawable(pf[0]);
    }

    protected void onPostExecute(Drawable result) {
        ar.processFinish(result);
    }

    public Drawable fetchDrawable(ParseFile pf) {
        InputStream is;
        try {
            is = (InputStream) new URL(pf.getUrl()).getContent();
            return Drawable.createFromStream(is,null);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

@Override
public void processFinish(Drawable d) {
    appIconDrawable[i] = d; // i also tried testing appIconDrawable[1] = d and the app loaded with all blank images and then crashes
}

这是界面AsyncResponse

public interface AsyncResponse {
    void processFinish(Drawable d);
}

1 个答案:

答案 0 :(得分:1)

好像你需要一点重构......

您期望来自Drawable[]的{​​{1}}但是您将始终获得一个空集,因为您开始下载,该下载发生在单独的线程中,然后更新返回值。

您应该在queryAppIcon()内将Drawable设置为ImageView

错误的迹象:下载图像等异步方法永远不会有返回值。

<强>更新

这是一个非常简单的下载AsyncTask但是有许多检查,优化等缺失,比如CACHE!此外,processFinish内的ImageView应由DownloadImageTask(Google it)保留,否则会泄露您的活动。

WeakReference

适配器:

public class DownloadImageTask extends AsyncTask<String, Void, Drawable> {

    private static final String TAG = DownloadImageTask.class.getSimpleName();
    private ImageView mImageView;

    DownloadImageTask(ImageView imageView) {
        mImageView = imageView;
    }

    @Override
    protected Drawable doInBackground(String... url) {
        return fetchDrawable(url[0]);
    }

    @Override
    protected void onPostExecute(Drawable result) {
        if (result != null) {
            mImageView.setImageDrawable(result);
        } else {
            Log.w(TAG, "Could download image!");
        }
    }

    public static Drawable fetchDrawable(String url) {
        Log.v(TAG, "Downloading: " + url);
        InputStream is;
        try {
            is = (InputStream) new URL(url).getContent();
            return Drawable.createFromStream(is, null);
        } catch (MalformedURLException e) {
            Log.e(TAG, e.getMessage(), e);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }

        return null;
    }
}

的活动:

public class ImageDownloadAdapter extends ArrayAdapter<String>{

    public ImageDownloadAdapter(Context context, String[] objects) {
        super(context, R.layout.item_image_download, R.id.txt_url, objects);
    }

    @SuppressLint("NewApi")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        String url = getItem(position);

        ImageView imageView = (ImageView) view.findViewById(R.id.img_download);
        DownloadImageTask downloadImageTask = new DownloadImageTask(imageView);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            downloadImageTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
        } else {
            downloadImageTask.execute(url);
        }
        return view;
    }
}