【问题标题】:Load Bitmap from JSON android without Async Task从没有异步任务的 JSON android 加载位图
【发布时间】:2018-01-19 15:43:32
【问题描述】:

我想询问 Android,我有 JSON,我想将它加载到 Grid View 或 List View 中。我已经将我的 JSON (base64) 转换为位图并使用 AsyncTask 加载它,但它真的很慢,因为我先加载所有 JSON 然后显示它。实际上我不想先加载它然后显示所有 JSON。我想一一加载。所以我不会等太久。 我能用什么?

这里是我的示例代码;

 private class GetImageProduct extends AsyncTask<String,Void,Object>{

        @Override
        protected Objects doInBackground(String... params) {
            String productCode = params[0];
            String skuCode = params[1];
            String productImageUrl = ""+urlProduct+"?filter={\"where\":{\"Code\":\""+ productCode +"\"}}";
            HttpHandler sh = new HttpHandler();
            String jsonString = sh.makeServiceCall(productImageUrl);
            Log.e(TAG, "Response from url: " + jsonString);

            if(jsonString != null){
                try{
                    JSONArray productDetails = new JSONArray(jsonString);
                    for(int j=0 ;j<productDetails.length();j++){

                        JSONObject q = productDetails.getJSONObject(j);
                        String productImage = q.getString("Image");
                        String productName = q.getString("Name");
                        String encodeImage = productImage.replace("data:image/jpeg;base64,","").replace("data:image/png;base64,","");
                        byte[] decodedString = Base64.decode(encodeImage,Base64.DEFAULT);
                        Bitmap base64Bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
                        Bitmap resized = Bitmap.createScaledBitmap(base64Bitmap, 1000,1000,true);

                        HashMap<String, Object> productData = new HashMap<String,Object>();
                        productData.put("base64Bitmap",resized );
                        productData.put("productName",productName);
                        imageList.add(productData);


                    }
                }catch(final JSONException e){
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    LENGTH_LONG)
                                    .show();
                        }
                    });
                }
            }

            return null;
        }
        @Override
        protected void onPostExecute(Object result) {
            super.onPostExecute(result);
            if (pDialog.isShowing()) {
                pDialog.dismiss();
            }


            ExtendedSimpleAdapterMapping adapter2 = new ExtendedSimpleAdapterMapping(
                    MappingProductActivity.this, imageList,
                    R.layout.list_selected_product,
                    new String[]{"base64Bitmap","productName"},
                    new int[]{R.id.imageSelId, R.id.txtProductName}
            );
            lv.setAdapter(adapter2);
        }
    }

【问题讨论】:

    标签: android json bitmap android-asynctask


    【解决方案1】:

    这不是好方法,您必须只从服务器返回图像名,并将其与您的网址连接起来,例如http://localhost/images/yourimage.jpg

    用于将图像从 Android 发送到 PHP 并将其存储在服务器检查 here 的文件中

    【讨论】:

    • 我已经有来自 API 的数据库 64。我只想加载它。但由于异步任务,它真的很慢。我想在加载其中一个数据时先加载它。那么,我必须更改数据类型吗?从base64到数据库中的Url?
    • 您在加载位图图像时遇到问题吗??
    • 没有。我可以很好地加载它,但是需要很长时间,因为必须先加载整个数据,然后适配器才能显示它。
    • 不,我没用过。我只是将base64转换为位图并在do..background完成后加载它并且适配器显示它。但是,问题是 do..background 非常慢,因为从 API 获取和转换 base64 的循环。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多