第一次尝试时 Picasso 未加载图像 android

Piccaso not loading Image on First Attempt android

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

更新了 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;
        }
    }

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

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

对于周引用的特定问题,请尝试创建一个全局 Target 对象。如以下代码所示。

代码示例:

    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);