1

我有一个我一直在研究的 android 应用程序,它从服务器下载图像,将其读入位图并将其显示在 ImageView 上

这在大多数情况下都很好用,但每隔一段时间,它就会经历这个过程(有一个 ProgressDialog 说“正在获取图像......”),一旦完成,什么都不会显示。logcat 中没有任何东西似乎与此无关。

这是代码:

    Bitmap image = null;

    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(webService + "?cmd=get");

    try
    {
        HttpResponse resp = client.execute(get);

        Log.i("PhotoRouletteDebug", "Resp buffer size: " + (int)resp.getEntity().getContentLength());
        InputStream is = resp.getEntity().getContent();

        BufferedInputStream buf = new BufferedInputStream(is, (int)resp.getEntity().getContentLength());

        image = BitmapFactory.decodeStream(buf);

        // clean up
        buf.close();
        is.close();

即使没有显示任何内容,Resp 内容长度也总是报告正确的大小,但仍然没有显示任何内容。

此代码是从 AsyncTask 调用的,但一次只能调用 1 个任务。

这让我发疯,我不知道为什么它一直这样做。

编辑:这是设置 imageView 的代码

// AsyncTask for Getting a new image from the queue
protected class GetImageTask extends AsyncTask<String, String, Bitmap>
{
    protected void onPreExecute()
    {
        // lets show a progress dialog so the user knows something is going on
        progressDialog = ProgressDialog.show(PhotoRoulette.this, "", "Fetching image...", true);
    }

    protected void onPostExecute (Bitmap image)
    {
        // we got a new photo so lets display it where it needs to be displayed
        try
        {
            photoView = (ImageView)findViewById(R.id.photoView);
            photoView.setImageBitmap(image);
        }
        catch (Exception e)
        {
            Log.e("Debug", "Something absolutely retarded happened", e);
        }

        // hide the progress dialog - we're all done
        progressDialog.dismiss();
    }

    protected Bitmap doInBackground(String... urls)
    {
        // Get a new Bitmap Queue Image
        Bitmap image = imageHandler.getQueueImage();
        return image;
    }
}
4

1 回答 1

1

您没有向我们展示显示图像的代码,因此我们不确定该代码是否正确。也许问题出在那儿?

但假设问题是图像已损坏,这就是我开始调试的方法:bufPushbackInputStream包装。从 buf 中读取字节并将它们保存到文件中;然后将这些相同的字节推回PushbackInputStream. 然后传入PushbackInputStreaminto BitmapFactory.decodeStream。如果图像显示成功,则删除文件(手动或以编程方式)。否则,您现在可以在闲暇时检查位图。

于 2010-12-17T01:36:43.453 回答