DZhuk
DZhuk

Reputation: 83

Get image in gridview from server

I have application, that get images by address "http://xn--e1aybc.xn--76-6kc1ag2ab9l.xn--p1ai/food.png"(for example) from server

public class MenuActivity extends Activity {

private static ArrayList<Products> myProducts;
ParseJSON parseJSON;
private static ArrayList <Bitmap> bm;

final String GetMenuUrl = "http://xn--e1aybc.xn--76-6kc1ag2ab9l.xn--p1ai/get_menu.php";
String City = "Moscow";
String NameCinema = "Avrora";
private ProgressDialog dialog;
private String response;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menu);
    init();
    new RequestTask().execute(GetMenuUrl);
}


private void init(){

    myProducts = new ArrayList<Products>();
    parseJSON = new ParseJSON();

}


private void setAdapter(ArrayList<Products> products){

    GridView grid;



    for(int i = 0; i < myProducts.size(); i++){

        try {
            bm.add(downloadBitmap("http://xn--e1aybc.xn--76-6kc1ag2ab9l.xn--p1ai/food.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    System.out.println("size == " + bm.size());


    final ImageView imageView = (ImageView) findViewById(R.id.imageView);
    SetImg("http://xn--e1aybc.xn--76-6kc1ag2ab9l.xn--p1ai/food.png",imageView);

    System.out.println("size == " + bm.size());

    CustomGrid adapter = new CustomGrid(MenuActivity.this, products, bm);
    grid=(GridView)findViewById(R.id.grid);
    grid.setAdapter(adapter);
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            Toast.makeText(MenuActivity.this, "Продукт " + myProducts.get(position).getProductName() + " добавлен в корзину", Toast.LENGTH_SHORT).show();
        }
    });


}


private void SetImg(final String url,final ImageView v){
    final ProgressDialog dialog = ProgressDialog.show(this, "Download",
            "downloading");
    dialog.show();
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                final Bitmap downloadBitma = downloadBitmap(url);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        v.setImageBitmap(downloadBitma);
                    }
                });

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                dialog.dismiss();
            }
        }
    }).start();
}

private Bitmap downloadBitmap(String url) throws IOException {
    HttpUriRequest request = new HttpGet(url.toString());
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(request);

    StatusLine statusLine = response.getStatusLine();
    int statusCode = statusLine.getStatusCode();
    if (statusCode == 200) {
        HttpEntity entity = response.getEntity();
        byte[] bytes = EntityUtils.toByteArray(entity);

        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
                bytes.length);
        return bitmap;
    } else {
        throw new IOException("Download failed, HTTP response code "
                + statusCode + " - " + statusLine.getReasonPhrase());
    }
}


class RequestTask extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        try {

            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler<String> res = new BasicResponseHandler();

            HttpPost postMethod = new HttpPost(params[0]);

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("city", City));

            nameValuePairs.add(new BasicNameValuePair("name_cinema",NameCinema));

            postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            response = hc.execute(postMethod, res);

            parseJSON.parse(response.toString());
            Log.d("response == ", response.toString());
            myProducts = parseJSON.getObjects();

            Log.d("firstProduc == ", myProducts.get(0).getProductName());



        } catch (Exception e) {
            System.out.println("Exp=" + e);
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {

        if (dialog != null && dialog.isShowing())
            dialog.dismiss();

        ArrayList<String> products = new ArrayList<String>();
        for(int i = 0 ; i < myProducts.size(); i++){
            products.add(myProducts.get(i).getProductName());
        }
        if(products.size() != 0)
            setAdapter(myProducts);
        else Log.d("error", "can`t load");
        super.onPostExecute(result);
    }
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(MenuActivity.this);
        dialog.setMessage("Загружаюсь...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(true);
        dialog.show();
        super.onPreExecute();
    }
}
}

//display images to gridview

public class CustomGrid extends BaseAdapter{
private Context mContext;
private final ArrayList<Products> web;

private final ArrayList<Bitmap> Imageid;
public CustomGrid(Context c,ArrayList<Products> web,ArrayList<Bitmap>Imageid  ) {
    mContext = c;
    this.Imageid = Imageid;
    this.web = web;

}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return web.size();
}
@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}
@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        grid = new View(mContext);
        grid = inflater.inflate(R.layout.rowlayout, null);
        TextView textView = (TextView) grid.findViewById(R.id.grid_text);
        TextView textDescr = (TextView) grid.findViewById(R.id.grid_description);
        final ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
        textView.setText(web.get(position).getProductName());
        textDescr.setText(String.valueOf(web.get(position).getProductPrice()) + "руб.");
      //  imageView.setImageResource(Imageid[position]);
        imageView.setImageBitmap(Imageid.get(position));
           } else {
        grid = (View) convertView;
    }
    return grid;
}
}

But I have errors:

10-30 09:27:23.081    2820-2820/com.example.kinofood E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
        at java.net.InetAddress.getAllByName(InetAddress.java:214)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
        at com.example.kinofood.MenuActivity.downloadBitmap(MenuActivity.java:162)
        at com.example.kinofood.MenuActivity.setAdapter(MenuActivity.java:79)
        at com.example.kinofood.MenuActivity.access$400(MenuActivity.java:38)
        at com.example.kinofood.MenuActivity$RequestTask.onPostExecute(MenuActivity.java:232)
        at com.example.kinofood.MenuActivity$RequestTask.onPostExecute(MenuActivity.java:186)
        at android.os.AsyncTask.finish(AsyncTask.java:631)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

how can I change my code? thank you

Upvotes: 0

Views: 1272

Answers (1)

Łukasz Culer
Łukasz Culer

Reputation: 21

You can't download on MainThread. If You want to do this Your way, You will have to load it asynchronously, i.e. using AsyncTask.

But the best way to load online images into ImageViews is use of 3rd party libraries.

Libraries known to me:

Universal Image Loader - https://github.com/nostra13/Android-Universal-Image-Loader

Picasso - http://square.github.io/picasso/

Besides simply loading images they handle for You caching, animations, event handling etc.

Upvotes: 1

Related Questions