从没有异步任务的 JSON android 加载位图

Posted

技术标签:

【中文标题】从没有异步任务的 JSON android 加载位图【英文标题】:Load Bitmap from JSON android without Async Task 【发布时间】: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);
        
    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

以上是关于从没有异步任务的 JSON android 加载位图的主要内容,如果未能解决你的问题,请参考以下文章

如何从没有数组名称的android中的json中获取数据?

Android之ListView&Json加载网络数据

android异步加载

android中的JSON解析和获取图像

异步任务片段背景数据

Android异步加载网络图片