将finalBufferData转换为img url进行显示

时间:2016-03-30 08:11:07

标签: json android-studio android-asynctask imageview android-linearlayout

我正在尝试从要显示的JSON部分构建几个图像url。

我能够检索JSON,然后从JSON构造几个url,将其显示为屏幕上的文本(String)。

在AsyncTask的末尾,我使用通用图像加载器来显示单个图片,以防JSON包含单张图片的信息,但问题是从JSON构造了几个网址:

 public class JsonTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            String finalJson = buffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("resources");

            StringBuffer finalBufferData = new StringBuffer();

            for(int i=0; i<parentArray.length(); i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);

                String publicID = finalObject.getString("public_id");
                String version = finalObject.getString("version");
                String format = finalObject.getString("format");
                finalBufferData.append("http://res.cloudinary.com/CLOUD_NAME/" + fileType +
                        "/upload/v" + version + "/" + publicID + "." + format);

            }
            return finalBufferData.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();


            }
            try {
                if (reader != null) {
                    reader.close();

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

            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        ImageLoader.getInstance().displayImage(result, imageViewDisplayUp);

        //imagesList.setText(result);
    }

}

它只是在单独的行中创建一个地址字符串(如果在textView中显示),但是传递给UIL是不可接受的。

所以我不知道如何做到这一点,因为我试图在线性视图中的listView中创建一个图像视图,或者根据JSON信息显示多个图像。

关于如何做到这一点的任何建议都会很棒。

我的AsyncTask代码吧;

{{1}}

}

1 个答案:

答案 0 :(得分:0)

通过添加另一个不在JSON中但从其他JASON字符串创建的String找到了解决方法。

由于public_id,版本和格式都是从Cloudinary下载的JSON,需要为要传递到ImageLoader的图像构建正确的地址,我无法找到另一种方法来检索上传的图片列表由具有Cloudinary的特定标记的用户,不使用需要在程序中编写api_secret的admin api,我最终执行以下操作;

public class JsonTask extends AsyncTask<String, String, List<upImgModels> > {



    @Override
    protected List<upImgModels> doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            String finalJson = buffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("resources");


            List<upImgModels> upImgList = new ArrayList<>();

            for(int i=0; i<parentArray.length(); i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);

                upImgModels upImgModels = new upImgModels();
                upImgModels.setPublic_id(finalObject.getString("public_id"));
                upImgModels.setVersion(finalObject.getString("version"));
                upImgModels.setFormat(finalObject.getString("format"));

                upImgModels.setAddress("http://res.cloudinary.com/we4x4/" + fileType
                        + "/upload/v" + finalObject.getString("version") + "/"
                        + finalObject.getString("public_id") + "." +
                        finalObject.getString("format"));

                upImgList.add(upImgModels);
            }
            return upImgList;


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();


            }
            try {
                if (reader != null) {
                    reader.close();

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

            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(List<upImgModels> result) {
        super.onPostExecute(result);
        upImgAdapter adapter = new upImgAdapter(getApplicationContext(), R.layout.row, result);
        listViewUpload.setAdapter(adapter);
        //imagesList.setText(result);
    }

}


public class upImgAdapter extends ArrayAdapter{

    public List<upImgModels> upImgModelsList;
    private int resource;
    private LayoutInflater inflater;
    public upImgAdapter(Context context, int resource, List<upImgModels> objects) {
        super(context, resource, objects);
        upImgModelsList = objects;
        this.resource = resource;
        inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){

        if(convertView == null){
            convertView = inflater.inflate(R.layout.row, null);
        }

        ImageView imageViewDisplay;
        imageViewDisplay = (ImageView)convertView.findViewById(R.id.imageViewDisplay);

        ImageLoader.getInstance().displayImage(upImgModelsList.get(position).getAddress(), imageViewDisplay);

        return convertView;
    }
}

}

我希望有人可以建议一个更好的方法来做到这一点,如果有可能,我相信是这样的。