从没有异步任务的 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 加载位图的主要内容,如果未能解决你的问题,请参考以下文章