Android с использованием асинхронного http-соединения для получения растрового изображения - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь использовать асинхронные запросы для извлечения изображений из URL, чтобы предотвратить зависание URL. Это фрагмент кода, который я использую для этого

private void setImg(final ImageView im, String url){
    AsyncHttpClient client = new AsyncHttpClient();
    client.get(url, new AsyncHttpResponseHandler(){
        public void onSuccess(String response){
            try{
                byte[] imageAsBytes = response.getBytes();
                im.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));
                im.refreshDrawableState();
            } catch(Throwable e){
                e.printStackTrace();
            }
        }
    });
}

Это всегда показывает это предупреждение в logcat

12-29 01:55:33.043: D/skia(14414): --- SkImageDecoder::Factory returned null

Я не могу найти подходящую причину для этого. Любая помощь?

Ответы [ 5 ]

5 голосов
/ 24 июля 2013

Теперь, когда в AsyncHttp был добавлен обработчик двоичного ответа, вы можете просто использовать функции Android BitmapFactory.decodeByeArray для Android:

AsyncHttpClient client = new AsyncHttpClient();
client.get(image_url, null, new AsyncHttpResponseHandler() {            
    @Override
    public void onSuccess(byte[] fileData) {
        Bitmap image = BitmapFactory.decodeByteArray(fileData, 0, fileData.length);
        //Do whatever you want with the image variable    
    }
});
1 голос
/ 24 февраля 2012

[ОБНОВЛЕНО] Обработка ответов на изображения (и любые двоичные данные) была добавлена ​​в библиотеку loopj android-async-http. Используйте BinaryHttpResponseHandler

[старая запись] AsyncHttpClient loopj еще не поддерживает обработку ответов byte []. Есть вилка, которая делает, но это беспорядок. Так что ответ один из них:

A1) Вы не.

A2) Вы используете вилку, предоставленную по ссылке по этой ссылке: https://github.com/loopj/android-async-http/issues/8

A3) Вы разветвляете AsyncHttpClient, добавляете обработку byte [] (не прерывая обработку ответа String, Иисус!) И фиксируете ее обратно в проект. Делая это, вы также получите кредиты кармы с открытым исходным кодом.

1 голос
/ 24 февраля 2012

Если кто-то еще работает над этим, вот как я это делаю

public static void setImg(final ImageView im, final String url){
    AsyncTask<Void, Void, Bitmap> t = new AsyncTask<Void, Void, Bitmap>(){
        protected Bitmap doInBackground(Void... p) {
            Bitmap bm = null;
            try {
                URL aURL = new URL(url);
                URLConnection conn = aURL.openConnection();
                conn.setUseCaches(true);
                conn.connect(); 
                InputStream is = conn.getInputStream(); 
                BufferedInputStream bis = new BufferedInputStream(is); 
                bm = BitmapFactory.decodeStream(bis);
                bis.close(); 
                is.close();
            } catch (IOException e) { 
                e.printStackTrace(); 
            }
            return bm;
        }

        protected void onPostExecute(Bitmap bm){
            Bitmap output = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(output);

            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bm.getWidth(), bm.getHeight());
            final RectF rectF = new RectF(rect);
            final float roundPx = 5;

            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(color);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
            canvas.drawBitmap(bm, rect, rect, paint);
            im.setImageBitmap(output);
        }
    };
    t.execute();
}
1 голос
/ 01 февраля 2012

В последнее время я использую следующую библиотеку: UrlImageViewHelper . Для загрузки изображения используется AsyncTask . Ваш код будет выглядеть примерно так:

private void setImg(final ImageView im, String url){
    UrlImageViewHelper.setUrlDrawable(im, url) ;
}

Очень просто, я прав?

0 голосов
/ 11 сентября 2014

Android использует асинхронное http-соединение для получения изображения и текста и отображения в виде списка

public class MainActivity extends Activity {
    ListView list;
    public String IPadd = "http://api.gifts.com/v2/search/product.json?category=Nur&api_key=fd2ut5evb9jgzerjkeph54pz";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list=(ListView) findViewById(R.id.listView1);
        new AsyTask().execute(IPadd);
    }

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

        @Override
        protected String doInBackground(String... url) {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url[0]);
            // HttpPost httpPost=new HttpPost(url[0]);
            String text = null;
            try {
                HttpResponse response = httpClient.execute(httpGet);
                text = EntityUtils.toString(response.getEntity());

            } catch (Exception e) {
                return e.getLocalizedMessage();
            }

            return text;
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                JSONObject jObject = new JSONObject(result);
                JSONArray jarray = jObject.getJSONArray("products");
                for (int i = 0; i < jarray.length(); i++) {
                    ProductInfo p=new ProductInfo();
                    JSONObject jObj = jarray.getJSONObject(i);
                    p.setTitle(jObj.getString("title"));
                    p.setId(jObj.getString("price"));
                    p.setImage(jObj.getString("largeProductImageUrl"));
                    ProductInfo.arrayList.add(p);
                }
                ArrAdapter adapter=new ArrAdapter(getApplicationContext(),ProductInfo.arrayList);
                list.setAdapter(adapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }

    }
}

    public class ArrAdapter extends BaseAdapter{

    TextView id,title;
    ImageView img;
    Context context;
    static ArrayList<ProductInfo> listitem=new ArrayList<ProductInfo>();
    public ArrAdapter(Context applicationContext,ArrayList<ProductInfo> arrayList) {
        this.context=applicationContext;
        listitem=arrayList;
    }

    @Override
    public int getCount() {
        return listitem.size();
    }

    @Override
    public Object getItem(int position) {
        return listitem.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ProductInfo p=listitem.get(position);
        if(convertView==null)
        {
            LayoutInflater inflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.custom, null);
        }
        id=(TextView) convertView.findViewById(R.id.textView1);
        id.setText(p.getId());
        title=(TextView) convertView.findViewById(R.id.textView2);
        title.setText(p.getTitle());
        img=(ImageView) convertView.findViewById(R.id.imageView1);
        ImageLoader imageloader=new ImageLoader(img);
        imageloader.execute(p.getImage());
        return convertView;
    }

}

    public class ProductInfo {
    String ID,title,image;
    static ArrayList<ProductInfo> arrayList=new ArrayList<ProductInfo>();
    public void setId(String id)
    {
        this.ID=id; 
    }
    public String getId()
    {
        return ID;
    }
    public void setTitle(String tit)
    {
        this.title=tit; 
    }
    public String getTitle()
    {
        return title;
    }
    public void setImage(String img)
    {
        this.image=img; 
    }
    public String getImage()
    {
        return image;
    }

}

    class  ImageLoader extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public ImageLoader(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
          InputStream in = new java.net.URL(urldisplay).openStream();
          mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {

        }
        return mIcon11;
    }

    @Override 
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);

        bmImage.setImageBitmap(result);
     }
    }
...