安卓开发:如何在API调用加载图片完成后将进度条设置为不可见
解决方案
你当前的实现逻辑存在时序问题:Volley请求仅完成了获取图片直链的步骤,你在这一步结束就隐藏进度条,但此时Glide才刚开始加载真正的图片资源,就会出现进度条消失后图片仍在加载的问题。同时你没有处理请求失败的场景,出错时进度条会一直处于显示状态。
修正后的代码如下:
public class MainActivity extends AppCompatActivity { private ImageView imageView; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=findViewById(R.id.imageView); loadMeme(); } private void loadMeme(){ setProgressBarVisibility(true); RequestQueue queue = Volley.newRequestQueue(this); String url ="https://meme-api.herokuapp.com/gimme"; // 从指定URL请求JSON响应 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { String imageUrl= null; try { imageUrl = response.getString("url"); } catch (JSONException e) { e.printStackTrace(); setProgressBarVisibility(false); return; } // 把进度条隐藏逻辑放到Glide加载完成的回调中 Glide.with(MainActivity.this) .load(imageUrl) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { setProgressBarVisibility(false); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { setProgressBarVisibility(false); return false; } }) .into(imageView); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("ERROR ","接口请求失败"); setProgressBarVisibility(false); } }); queue.add(jsonObjectRequest); }
核心修改点
- 进度条隐藏逻辑从Volley请求成功回调移到Glide加载回调,确保图片真正加载完成后才隐藏进度条
- 新增JSON解析失败、Volley请求失败、Glide加载失败三种异常场景的进度条隐藏逻辑,避免进度条常驻
- 优化了方法名和变量名,表意更清晰,避免拼写歧义
内容的提问来源于stack exchange,提问作者Haseeb Wajid
相关产品推荐
相关产品推荐

