package com.qiniu.qiniulab.activity.image;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import com.qiniu.android.utils.AsyncRun;
import com.qiniu.qiniulab.R;
import com.qiniu.qiniulab.config.QiniuLabConfig;
import com.qiniu.qiniulab.utils.DomainUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class SimpleImageViewActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_image_view_activity);
new Thread(new Runnable() {
@Override
public void run() {
basicImageView();
}
}).start();
}
private void basicImageView() {
List<String> imageUrls = this.getImageUrls();
final GridView gridView = (GridView) this.findViewById(R.id.simple_grid_image_view);
ArrayList<HashMap<String, Object>> viewData = new ArrayList<HashMap<String, Object>>();
for (String imageUrl : imageUrls) {
HashMap<String, Object> item = new HashMap<String, Object>();
item.put("image", imageUrl);
viewData.add(item);
}
final SimpleAdapter adapter = new SimpleAdapter(this, viewData,
R.layout.simple_image_view_item,
new String[]{"image"},
new int[]{R.id.image});
adapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object data, String textRepresentation) {
if (view instanceof ImageView && data instanceof String) {
final OkHttpClient httpClient = new OkHttpClient();
final String imageUrl = data.toString();
final URI imageUri = URI.create(imageUrl);
final String host = imageUri.getHost();
final ImageView imageView = (ImageView) view;
new Thread(new Runnable() {
@Override
public void run() {
String reqImageUrl = imageUrl;
Response response = null;
try {
String ip = DomainUtils.getIpByDomain(host);
if (ip != null) {
reqImageUrl = String.format("%s://%s%s", imageUri.getScheme(), ip, imageUri.getPath());
if (imageUri.getQuery() != null) {
reqImageUrl = String.format("%s?%s", reqImageUrl, imageUri.getQuery());
}
}
final Request.Builder builder = new Request.Builder();
Request request = builder.url(reqImageUrl).addHeader("Host", host).method("GET", null).build();
response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
byte[] bytes = response.body().bytes();
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
AsyncRun.runInMain(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
} catch (IOException e) {
} finally {
if (response != null) {
response.body().close();
}
}
}
}).start();
return true;
} else {
return false;
}
}
});
AsyncRun.runInMain(new Runnable() {
@Override
public void run() {
gridView.setAdapter(adapter);
}
});
}
private List<String> getImageUrls() {
final List<String> imageUrls = new ArrayList<String>();
final OkHttpClient httpClient = new OkHttpClient();
//获取设备的分辨率,以从服务器获取合适大小的图片显示
DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
Request req = new Request.Builder().url(QiniuLabConfig.makeUrl(
QiniuLabConfig.REMOTE_SERVICE_SERVER,
QiniuLabConfig.PUBLIC_IMAGE_VIEW_LIST_PATH) + "?device_width=" + dm.widthPixels).method("GET", null).build();
Response resp = null;
try {
resp = httpClient.newCall(req).execute();
if (resp.isSuccessful()) {
JSONObject jsonObject = new JSONObject(resp.body().string());
JSONArray imagesArray = jsonObject.getJSONArray("images");
int count = imagesArray.length();
for (int i = 0; i < count; i++) {
imageUrls.add(imagesArray.getString(i));
}
}
} catch (Exception ex) {
} finally {
if (resp != null) {
resp.body().close();
}
}
return imageUrls;
}
}