进度条不会出现在ImageView

时间:2017-09-27 02:40:53

标签: android android-volley android-progressbar

我想知道我做错了什么。我的代码很简单,如果你有一个进度条可以在你的任何应用程序中加载图像,那么你想要一个如何使它成功的例子,谢谢!我正在使用凌空的图像加载器,进度条永远不会出现

        holder.mProgressBar.setVisibility(View.VISIBLE);
    if (video.thumbnail != null) {
        mImageLoader.get(video.thumbnail, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                holder.mProgressBar.setVisibility(View.GONE);
                holder.mScreenShot.setImageBitmap(response.getBitmap());
            }

            @Override
            public void onErrorResponse(VolleyError error) {
                holder.mProgressBar.setVisibility(View.GONE);
            }
        });
    }

我的XML

            <RelativeLayout
            android:id="@+id/image_load"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:background="@android:color/darker_gray"
                android:id="@+id/thumbnail"
                android:layout_width="match_parent"
                android:layout_height="@dimen/album_cover_height"
                android:clickable="true"
                android:foreground="?attr/selectableItemBackgroundBorderless"
                android:scaleType="fitXY" />

            <ProgressBar
                android:visibility="gone"
                android:id="@+id/progressBar"
                style="?android:attr/progressBarStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true" />

        </RelativeLayout>

2 个答案:

答案 0 :(得分:0)

有关onResponse(ImageLoader.ImageContainer response, boolean isImmediate)如何运作的详细说明,请参阅此前一个问题。

Volley, How many times the onResponse in ImageLoader.ImageListener called

我相信它基本上只是立即关闭你的进度条。之前没有做过这个特别的事情,但基于另一个问题,我认为你想添加一个检查:

if(!isImmediate)
 holder.mProgressBar.setVisibility(View.GONE);

答案 1 :(得分:0)

绝对是时间问题。我尽可能地复制你的场景。

public class MainActivity extends AppCompatActivity {
ImageView image;
ProgressBar pb;
public String url;
public ImageLoader imageLoader;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    image = (ImageView) findViewById(R.id.image);
    pb = (ProgressBar) findViewById(R.id.pb);

    RequestQueue queue = Volley.newRequestQueue(this);
    url = "http://www.hrwiki.org/w/images/thumb/d/d5/currentbad.png/180px-currentbad.png";

    imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
        private final LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(20);

        @Override
        public Bitmap getBitmap(String url) {
            return cache.get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            cache.put(url, bitmap);
        }
    });


    show();
    new testTask().execute(imageLoader);


}

public void show() {
    image.setVisibility(View.INVISIBLE);
    pb.setVisibility(View.VISIBLE);
}

public void hide() {
    image.setVisibility(View.VISIBLE);
    pb.setVisibility(View.INVISIBLE);
}


private class testTask extends AsyncTask<ImageLoader, Void, Void> {


    @Override
    protected Void doInBackground(ImageLoader... params) {
        SystemClock.sleep(5000);

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        imageLoader.get(url, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                hide();
                image.setImageBitmap(response.getBitmap());

            }

            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
    }
}

}

使用此布局文件:

 <FrameLayout
    android:layout_width="100dp"
    android:layout_height="100dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"
        android:id="@+id/image" />
    <ProgressBar
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"
        android:id="@+id/pb"/>
</FrameLayout>

我看到了同样的行为,直到我把aSync任务放在基本等待5秒才加载图像之前。这肯定表明OnResponse被调用得如此之快,以至于你没有看到进度条。

看起来Michelle的答案有你想要实现的一些预检查逻辑。