【问题标题】:Piccaso not loading Image on First Attempt android毕加索没有在第一次尝试android上加载图像
【发布时间】:2016-11-01 15:08:53
【问题描述】:

在我的应用程序中,我有一个片段,它从远程服务器加载图像以使用AsynTask 设置FrameLayout 的背景,在onPostExeccute() 方法中,我尝试使用Picasso 渲染位图图像。但是当我的 Fragment 第一次启动时,FrameLayout 的背景中没有加载任何图像,但是当我刷新特定的 Fragment 时,我可以看到 Image 作为背景。

更新了 AsyncTask 中的代码段

      private class AsyncDataClass extends AsyncTask<String, Void, String> {

        @Override

        protected String doInBackground(String... params) {

            String responseBody = "";

            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
            HttpConnectionParams.setSoTimeout(httpParameters, 5000);
            HttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost httpPost = new HttpPost(params[0]);
            String jsonResult = "";
            try {

                HttpResponse response = httpClient.execute(httpPost);
                jsonResult = inputStreamToString(response.getEntity().getContent()).toString();
                System.out.println("Returned Json object " + jsonResult.toString());
            } catch (ClientProtocolException e) {

                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return jsonResult;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ctx);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override

        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            System.out.println("Resulted Value: " + result);
            if(result.equals("") || result == null){
                Toast.makeText(ctx, "Server connection failed", Toast.LENGTH_LONG).show();

            }
            int jsonResult = returnParsedJsonObject(result);
            if(jsonResult == -1){

                    Toast.makeText(ctx, "Sorry No Places Found", Toast.LENGTH_LONG).show();


            }
            if(jsonResult == 1){
                //Toast.makeText(ctx, "", Toast.LENGTH_LONG).show();
                try {
                    JSONObject jsonObj = new JSONObject(result);
                    // Getting JSON Array node
                    places = jsonObj.getJSONArray("result");
                    // looping through All Contacts
                    for (int i = 0; i < places.length(); i++) {
                        JSONObject place = places.getJSONObject(i);
//                        String slot = c.getString(TAG_SLOT);
//                        serverReturn.add(slot);
                        UserPlaces placeFroServer = new UserPlaces();
                        placeFroServer.setId(place.getString(TAG_PID));
                        placeFroServer.setName(place.getString(TAG_PNAME));
                        placeFroServer.setDescription(place.getString(TAG_DESC));
                        placeFroServer.setImg(place.getString(TAG_IMG));
                        placeFroServer.setLat(place.getString(TAG_LAT));
                        placeFroServer.setLng(place.getString(TAG_LNG));
                        placesList.add(placeFroServer);

                    }


                    UserPlaces myPlace =  placesList.get(counter);

                    pid=myPlace.getId();
                    lat = myPlace.getLat();
                    lng = myPlace.getLng();
                    Picasso.with(ctx).load(myPlace.getImg()).into(new Target() {
                        @Override
                        public void onPrepareLoad(Drawable arg0) {
                            // TODO Auto-generated method stub

                        }

                        @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) {
                            // TODO Auto-generated method stub
                            Toast.makeText(ctx,"Loaded",Toast.LENGTH_LONG).show();
                            pImg.setBackgroundDrawable(new BitmapDrawable(ctx.getResources(), bitmap));
                            pImg.invalidate();

                        }

                        @Override
                        public void onBitmapFailed(Drawable arg0) {
                            // TODO Auto-generated method stub
                            Toast.makeText(ctx, "Failed Loading", Toast.LENGTH_SHORT).show();
                        }
                    });

                    pname.setText(myPlace.getName());
                    pdes.setText(myPlace.getDescription());
                    rl.setVisibility(View.VISIBLE);

                    counter++;


                } catch (JSONException e) {

                    String ex = e.getMessage();
                    e.printStackTrace();
                }





            }
            if (pDialog.isShowing())
                pDialog.dismiss();
        }

        private StringBuilder inputStreamToString(InputStream is) {
            String rLine = "";
            StringBuilder answer = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            try {
                while ((rLine = br.readLine()) != null) {
                    answer.append(rLine);
                }
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
            return answer;
        }
    }

【问题讨论】:

  • 我推荐使用 Glide...同时验证图像的大小

标签: android android-fragments picasso


【解决方案1】:

对于周参考的特殊问题,请尝试创建一个全局目标对象。如下代码所示。

代码示例:

    Target target;
    target = new Target(){
                    @Override
                    public void onPrepareLoad(Drawable arg0) {
                        // TODO Auto-generated method stub

                    }

                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) {
                        //Toast.makeText(ctx,"Loaded",Toast.LENGTH_LONG).show();
                        // TODO Auto-generated method stub
                        pImg.setBackgroundDrawable(new BitmapDrawable(ctx.getResources(), bitmap));
                        pImg.invalidate();

                    }

                    @Override
                    public void onBitmapFailed(Drawable arg0) {
                        // TODO Auto-generated method stub
                        Toast.makeText(ctx, "Failed Loading", Toast.LENGTH_SHORT).show();
                    }
                };

   Picasso.with(ctx).load(myPlace.getImg()).into(target);

【讨论】:

    【解决方案2】:

    你应该在设置背景后在pImg上调用invalidate()

    【讨论】:

    • 我按照你的建议尝试了 pImg.invalidate();设置背景后还是没有效果
    • @MehvishFaisal 你确定这条线是第一次执行吗?在 set 语句之前添加一个 Toast 并查看。
    • @muratgu onBitmapLoaded 不是第一次调用。但在我刷新时,其余时间都可以。
    • @MehvishFaisal 这意味着您的毕加索电话第一次无法正常工作。它在哪里打这个电话?更新问题。
    • 我已经更新了调用毕加索的代码部分
    【解决方案3】:

    您可以使用它的替代品Univerasal Image Loader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 2016-06-27
      • 2014-09-26
      • 2016-06-14
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多