从 URL 中存储在 Android 中的 JSONString 中的 ImageView 中加载图像
Load Image in ImageView from URL stored in JSONString in Android
我有一个 JSON
字符串,说一个名字和一个 Url 。我需要将名称提取到 TextView
中,并在 ImageView
中提取和显示图像。
以下是上述场景的代码。
public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}";
我需要在我创建的 TextView
中显示名称,并从 url 中获取图像并显示在 Imageview
中。
您可以使用 GSON
库将 json 解析为普通的 Java 对象,然后使用该对象填充 TextView 和 ImageView。如果你不想使用外部库,你可以像这样使用 JSON 类:
JSONObject object = new JSONObject("your strnig");
JSONObject webimages = object.getJSONObject("WebImages");
String imageName = webimages.getString("image_name")
String imageUrl = webimages.getString("imageurl")
使用 Universal Image Loader 加载图片非常快速流畅
首先使用Gson解析Json得到url字符串,然后就可以使用UniversalImageLoader库(异步图片下载,非常好用)https://github.com/nostra13/Android-Universal-Image-Loader
static public DisplayImageOptions options= new DisplayImageOptions.Builder().cacheOnDisk(true).cacheInMemory(true).build();
imageLoader.displayImage(imgUrl, ivImage, options, new ImageLoadingListener() {
public void onLoadingStarted(String imageUri, View view) {
((ImageView)view).setImageResource(R.drawable.nofoto);
}
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
((ImageView)view).setImageResource(R.drawable.nofoto);
}
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
public void onLoadingCancelled(String imageUri, View view) {
}
});
您可以像这样提取图像名称和 url
public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}";
JSONObject jsonObject = new JSONObject(JSON_STRING);
JSONObject webImages = jsonObject.getJSONObject("WebImages");
String imageName = webImages.getString("Imagename");
String imageUrl = webImages.getString("imageurl");
现在,您有了 imageName 和 imageUrl。您可以轻松地设置文本,如 myTextView.setText(imageName)
。为了将图像加载到 ImageView,我建议使用 Picasso 库。它非常易于使用。你只需要一行代码,看起来像
Picasso.with(context).load(imageUrl).into(imageView);
你可以这样做。
public static final String JSON_STRING="{"WebImages":{"Imagename":"image_name","imageurl":http://www.example.com/image/example.png}}";
private ImageLoader _ImageLoader;
try {
JSONObject _jObj = new JSONObject(JSON_STRING);
JSONObject _jSubObj = _jObj .getJSONObject("WebImages");
String _imageName= _jSubObj.getString("Imagename");
YOUR_TEXTVIEW.setText(_imageName);
String _imageURL= _jSubObj.getString("imageurl");
_ImageLoader = new ImageLoader(CURRENT_ACTIVITY.this);
_ImageLoader.DisplayImage(_imageURL,
R.drawable.ic_launcher, YOUR_IMAGEVIEW);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
int stub_id = R.drawable.ic_launcher;
public void DisplayImage(String url, int loader, ImageView imageView)
{
try {
stub_id = loader;
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
else
{
queuePhoto(url, imageView);
imageView.setImageResource(loader);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
public Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}
public Bitmap getFacebookImage(String userId) {
// TODO Auto-generated method stub
Bitmap bitmap = null;
try {
HttpGet httpRequest = new HttpGet(
URI.create(userId));
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
entity);
bitmap = BitmapFactory
.decodeStream(bufHttpEntity
.getContent());
httpRequest.abort();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
// final int REQUIRED_SIZE=200;
// int width_tmp=o.outWidth, height_tmp=o.outHeight;
// int scale=1;
// while(true){
// if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
//break;
//width_tmp/=2;
//height_tmp/=2;
// scale*=2;
// }
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=1;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
//Task for the queue
private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad){
this.photoToLoad=photoToLoad;
}
@Override
public void run() {
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}
//Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
public void run()
{
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
我有一个 JSON
字符串,说一个名字和一个 Url 。我需要将名称提取到 TextView
中,并在 ImageView
中提取和显示图像。
以下是上述场景的代码。
public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}";
我需要在我创建的 TextView
中显示名称,并从 url 中获取图像并显示在 Imageview
中。
您可以使用 GSON
库将 json 解析为普通的 Java 对象,然后使用该对象填充 TextView 和 ImageView。如果你不想使用外部库,你可以像这样使用 JSON 类:
JSONObject object = new JSONObject("your strnig");
JSONObject webimages = object.getJSONObject("WebImages");
String imageName = webimages.getString("image_name")
String imageUrl = webimages.getString("imageurl")
使用 Universal Image Loader 加载图片非常快速流畅
首先使用Gson解析Json得到url字符串,然后就可以使用UniversalImageLoader库(异步图片下载,非常好用)https://github.com/nostra13/Android-Universal-Image-Loader
static public DisplayImageOptions options= new DisplayImageOptions.Builder().cacheOnDisk(true).cacheInMemory(true).build();
imageLoader.displayImage(imgUrl, ivImage, options, new ImageLoadingListener() {
public void onLoadingStarted(String imageUri, View view) {
((ImageView)view).setImageResource(R.drawable.nofoto);
}
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
((ImageView)view).setImageResource(R.drawable.nofoto);
}
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
public void onLoadingCancelled(String imageUri, View view) {
}
});
您可以像这样提取图像名称和 url
public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}";
JSONObject jsonObject = new JSONObject(JSON_STRING);
JSONObject webImages = jsonObject.getJSONObject("WebImages");
String imageName = webImages.getString("Imagename");
String imageUrl = webImages.getString("imageurl");
现在,您有了 imageName 和 imageUrl。您可以轻松地设置文本,如 myTextView.setText(imageName)
。为了将图像加载到 ImageView,我建议使用 Picasso 库。它非常易于使用。你只需要一行代码,看起来像
Picasso.with(context).load(imageUrl).into(imageView);
你可以这样做。
public static final String JSON_STRING="{"WebImages":{"Imagename":"image_name","imageurl":http://www.example.com/image/example.png}}";
private ImageLoader _ImageLoader;
try {
JSONObject _jObj = new JSONObject(JSON_STRING);
JSONObject _jSubObj = _jObj .getJSONObject("WebImages");
String _imageName= _jSubObj.getString("Imagename");
YOUR_TEXTVIEW.setText(_imageName);
String _imageURL= _jSubObj.getString("imageurl");
_ImageLoader = new ImageLoader(CURRENT_ACTIVITY.this);
_ImageLoader.DisplayImage(_imageURL,
R.drawable.ic_launcher, YOUR_IMAGEVIEW);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
int stub_id = R.drawable.ic_launcher;
public void DisplayImage(String url, int loader, ImageView imageView)
{
try {
stub_id = loader;
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
else
{
queuePhoto(url, imageView);
imageView.setImageResource(loader);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
public Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}
public Bitmap getFacebookImage(String userId) {
// TODO Auto-generated method stub
Bitmap bitmap = null;
try {
HttpGet httpRequest = new HttpGet(
URI.create(userId));
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
entity);
bitmap = BitmapFactory
.decodeStream(bufHttpEntity
.getContent());
httpRequest.abort();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
// final int REQUIRED_SIZE=200;
// int width_tmp=o.outWidth, height_tmp=o.outHeight;
// int scale=1;
// while(true){
// if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
//break;
//width_tmp/=2;
//height_tmp/=2;
// scale*=2;
// }
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=1;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
//Task for the queue
private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad){
this.photoToLoad=photoToLoad;
}
@Override
public void run() {
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}
//Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
public void run()
{
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}