Android 通过JSON将图像加载到ImageAdapter中

Android 通过JSON将图像加载到ImageAdapter中,android,json,gridview,baseadapter,Android,Json,Gridview,Baseadapter,嗨,我正在尝试GridViewdemo表单 它工作得非常好,但现在我想获取服务器数据库的图像。为此,我实现了处理程序类,它将传递我的URL并从服务器获取响应。作为响应,JSON将包含图像的URL。我还实现了一种方法,该方法将下载生成URL的图像表单,并将它们设置到位图数组中。。 服务处理程序类工作正常,但我不知道我在ImageAdapter类中所做的更改是否正确..请告诉我哪里出错。。 以下是ImageAdapter类的代码 public class ImageAdapter e

嗨,我正在尝试
GridView
demo表单

它工作得非常好,但现在我想获取服务器数据库的图像。为此,我实现了处理程序类,它将传递我的URL并从服务器获取响应。作为响应,JSON将包含图像的URL。我还实现了一种方法,该方法将下载生成URL的图像表单,并将它们设置到
位图
数组中。。 服务处理程序类工作正常,但我不知道我在
ImageAdapter
类中所做的更改是否正确..请告诉我哪里出错。。 以下是
ImageAdapter
类的代码

        public class ImageAdapter extends BaseAdapter {
        private Context mContext;
        Bitmap bm[]=new Bitmap[8];
        ImageAdapter img;
        public String[] imageurls=null;

        // Keep all Images in array
        public Integer[] mThumbIds ={
                R.drawable.pic_1, R.drawable.pic_2,
                R.drawable.pic_3, R.drawable.pic_4,
        };


        // Constructor
        public ImageAdapter(Context c){
            mContext = c;
            img =new ImageAdapter(mContext);
            new GetImageUrls(mContext).execute();

        }

        @Override
        public int getCount() {
            return mThumbIds.length;
        }

        @Override
        public Object getItem(int position) {
            return mThumbIds[position];
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {         
            ImageView imageView = new ImageView(mContext);
            if(bm[position]==null)
                    imageView.setImageResource(mThumbIds[position]);
            else
                imageView.setImageBitmap(bm[position]);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setLayoutParams(new GridView.LayoutParams(70, 70));
            return imageView;
        }


        public class GetImageUrls  extends AsyncTask<Void, Void, Void>
        {
            Context context;
            private ProgressDialog pDialog;
            // URL to get JSON
            private static final String url= "http://192.xxx.x.xxx/Demo_Folder/test.json";
            private static final String RESULT = "mainCategory";
            private static final String URLS = "mcatimage";
            // JSONArray
            JSONArray loginjsonarray=null;
            //result from url
            //public String[] imageurls=null;

            public GetImageUrls(Context c) {
                this.context=c;
            }

            protected void onPreExecute() {
                // Showing progress dialog
                pDialog = new ProgressDialog(context);
                pDialog.setMessage("Loading...");
                pDialog.setCancelable(false);
                //pDialog.show();
            }
            protected Void doInBackground(Void... arg) {
                // Creating service handler class instance
                ServiceHandler sh = new ServiceHandler();
                 // Making a request to url and getting response
                String jsonstr = sh.makeServiceCall(url, ServiceHandler.GET, null);
                Log.d("Response: ", ">"+jsonstr);
                if(jsonstr!=null){
                    try {
                            JSONObject jsonObj =new JSONObject(jsonstr);
                            loginjsonarray=jsonObj.getJSONArray(RESULT);
                            for(int i=0;i<loginjsonarray.length();i++){
                                JSONObject l=loginjsonarray.getJSONObject(i);
                                imageurls[i]=l.getString(URLS);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                }else{
                    Toast.makeText(context,"Check your Internet Connection",Toast.LENGTH_SHORT).show();
                }
                return null;
            }

            protected void onPostExecute(Integer result) {
                // Dismiss the progress dialog
                if(pDialog.isShowing()){
                    pDialog.dismiss();
                    new  ImageDownloader().execute();
                }

            }
        }

        private class ImageDownloader extends AsyncTask<Integer, Integer, String>
        {
            Context context;
            private ProgressDialog pDialog;
            @Override
            public void onPreExecute()
            {
                // Showing progress dialog
                pDialog = new ProgressDialog(context);
                pDialog.setMessage("Loading...");
                pDialog.setCancelable(false);
                //pDialog.show();
            }

            protected void onPostExecute(String result)
            {
                pDialog.hide();
            }
              protected void onProgressUpdate(Integer... progress) {
                  img.notifyDataSetChanged();
                 }
            protected String doInBackground(Integer... a)
            {
                for(int i=0;i<4;i++)
                {
                    bm[i]=downloadBitmap(imageurls[i]);
                    this.publishProgress(i);
                }
                return "";
            }
        }

        Bitmap downloadBitmap(String url) {

            final HttpClient client = new DefaultHttpClient();
            final HttpGet getRequest = new HttpGet(url);

            try {
                HttpResponse response = client.execute(getRequest);
                final int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode != HttpStatus.SC_OK) { 
                    Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); 
                    return null;
                }

                final HttpEntity entity = response.getEntity();
                if (entity != null) {
                    InputStream inputStream = null;
                    try {
                        inputStream = entity.getContent(); 
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        return bitmap;
                    } finally {
                        if (inputStream != null) {
                            inputStream.close();  
                        }
                        entity.consumeContent();
                    }
                }
            } catch (Exception e) {
                // Could provide a more explicit error message for IOException or IllegalStateException
                getRequest.abort();
                Log.e("ImageDownloader", "Error while retrieving bitmap from " + url);
            } finally {
                if (client != null) {
                    //client.
                }
            }
            return null;
        }

    }
公共类ImageAdapter扩展了BaseAdapter{
私有上下文;
位图bm[]=新位图[8];
图像适配器;
公共字符串[]imageurls=null;
//将所有图像保留在阵列中
公共整数[]mThumbIds={
R.drawable.pic_1,R.drawable.pic_2,
R.drawable.pic_3,R.drawable.pic_4,
};
//建造师
公共图像适配器(上下文c){
mContext=c;
img=新的图像适配器(mContext);
新建GetImageUrls(mContext.execute();
}
@凌驾
public int getCount(){
返回mThumbIds.length;
}
@凌驾
公共对象getItem(int位置){
返回mThumbIds[位置];
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父级){
ImageView ImageView=新的ImageView(mContext);
if(bm[位置]==null)
setImageResource(mThumbIds[position]);
其他的
setImageBitmap(bm[位置]);
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
setLayoutParams(新的GridView.LayoutParams(70,70));
返回图像视图;
}
公共类GetImageUrls扩展异步任务
{
语境;
私人对话;
//获取JSON的URL
私有静态最终字符串url=”http://192.xxx.x.xxx/Demo_Folder/test.json";
私有静态最终字符串RESULT=“maincegory”;
私有静态最终字符串url=“mcatimage”;
//杰索纳雷
JSONArray loginjsonarray=null;
//来自url的结果
//公共字符串[]imageurls=null;
公共getImageURL(上下文c){
context=c;
}
受保护的void onPreExecute(){
//显示进度对话框
pDialog=新建进度对话框(上下文);
设置消息(“加载…”);
pDialog.setCancelable(假);
//pDialog.show();
}
受保护的Void doInBackground(Void…arg){
//创建服务处理程序类实例
ServiceHandler sh=新的ServiceHandler();
//向url发出请求并获得响应
字符串jsonstr=sh.makeServiceCall(url,ServiceHandler.GET,null);
Log.d(“响应:”、“>”+jsonstr);
if(jsonstr!=null){
试一试{
JSONObject jsonObj=新的JSONObject(jsonstr);
loginjsonarray=jsonObj.getJSONArray(结果);
对于(int i=0;i删除该行

 img =new ImageAdapter(mContext);
来自
ImageAdapter
的构造函数。它试图创建无限多的
ImageAdapter
实例,从而导致
stackoverflowererror


为什么在
ImageAdapter
中需要另一个
ImageAdapter
实例?

谢谢它的工作,错误得到了解决..现在我得到了显示在“Log.d”(“Response:,“>”+jsonstr)中的图像URL但我无法在imageurls数组中获取这些图像。我哪里出错了。?@Aksh如果您有任何新的查询,您可以询问
 img =new ImageAdapter(mContext);