시나리오 : 조금 까다 롭지 만 재미 있습니다. JSON 응답을 요청하는 요청을 보냈습니다. 이 응답에는 JSON 요청 URL이 10 개 더 포함됩니다.Android : 런타임시 인터넷에서 이미지를 가져 와서 목록보기에 표시하는 더 효율적인 솔루션
다음 10 개의 URL에 요청을 보내면 각 URL에 2 개의 이미지 URL이 포함됩니다. 그것은 총 20 개의 이미지를 의미합니다.
내 의도는 가능한 한 빨리 ListView
에 이러한 이미지를 표시하는 것입니다. 이것은 내가 지금까지 한 일이다
1 단계 :은 즉시 활동이 시작되면, 유튜브와 같이 ProgressDialog
보여주는 로딩 원을 팝.
2 단계 :ASYNC TASK
에서 10 가지 JSON 요청의 URL을 제공하는 첫 번째 요청을 보냅니다. 이 요청을 보내고 &을 저장하고이 10 개의 URL을 응답으로 저장합니다.
3 단계 : 첫 번째 (10 점 만점)부터 시작하여 JSON 응답을 제공하는 요청을 보냅니다.
4 단계 :이 응답을 구문 분석하여 2 개의 이미지 URL을 가져 와서 LinkedList에 저장하십시오.
5 단계 : 이제 이미지의 실제 링크가 있으므로 진행 대화 상자를 닫고 이미지를 가져옵니다.
6 단계 :이 이미지는 drawable
에 저장됩니다. 이있는 ImageAdapter
이라는 사용자 정의 BaseAdapter
을 만들었습니다.
7 단계 : 스토어 사용이 ArrayList
에서 수신 된 당김 : adapter.mImages.add(drawable);
8 단계 : 다음이 바로 이미지를 표시 할 준비가 목록보기를 업데이트합니다 adapter.notifyDataSetChanged();
호출합니다.
9 단계 : 3 단계로 돌아가서 추가 URL을 처리하십시오.
public class ImageViewer extends Activity {
GridView gvImage;
private ProgressDialog progressDialog;
private final static Integer IMAGE_LIMIT = 10;
private ImageAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.ImageViewer);
gvImage = (GridView) findViewById(R.id.gvImage);
adapter = new ImageAdapter(this);
gvImage.setAdapter(adapter);
progressDialog = ProgressDialog.show(ImageViewer.this, "In Progress",
"Loading...", true, true, new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
finish();
}
});
new SendRequest().execute(null);
} catch (Exception e) {
}
}
class SendRequest extends AsyncTask {
protected Object doInBackground(Object... params) {
try {
HttpClient client = new DefaultHttpClient(httpParameters);
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet(BaseRequest_URL);
JSONObject jsonResponse = null;
HttpResponse httpResponse = client.execute(httpGet, localContext);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
jsonResponse = getJSONObjectFromEntity(entity); //getJSONObjectFromEntity() will return JSONObject
processJSON(jsonResponse);
}
progressDialog.dismiss();
} catch (Exception e) {
}
return null;
}
private void processJSON(JSONObject jsonResponse) throws JSONException {
for (int i = 0; i < IMAGE_LIMIT; i++) {
// Some JSON parsing. Output will be 'imageURL' which will be image URL
displayImage(imageURL);
}
}
public void displayImage(String uri150) {
try {
InputStream is = (InputStream) new URL(uri150).getContent();
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
Drawable d = Drawable.createFromStream(is, "image 150");
adapter.mImages.add(d);
handler.sendEmptyMessage(0); // Handler Below
} catch (Exception e) {
}
}
protected void onPostExecute(Object result) {
super.onPostExecute(result);
}
}
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
adapter.notifyDataSetChanged();
};
};
}
ImageAdapter 클래스
ActivityClass :
public class ImageAdapter extends BaseAdapter {
Context context;
public ArrayList<Drawable> mImages = new ArrayList<Drawable>();
public ImageAdapter(Context c) {
this.context = c;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(context);
try {
imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageDrawable(mImages.get(position));
imageView.setTag("Image" + position);
} catch (Exception e) {
}
return imageView;
}
}
질문 :
다음 코드 (스트라이프 모든 불필요한 코드)입니다내가 보는 방법은
ImageAdapter
입니다. 여러 번 호출됩니다. 그것을 줄일 수있는 다른 방법이 있습니까?어떻게 ImageAdapter 코드를 최적화 할 수 있습니까?
기타 개선 사항? 당신이 에서 OutOfMemoryException을 얻을 수있는 나는, 그것은 메모리에 이미지를 저장하는 잘못된이다 확실히 말할 수있는 무엇
나는 그것의 이미지 로딩 절반 프라임을 사용하는 것이 좋습니다. ListView 내에서 사용하는 방법에 대한 예제 프로젝트도 있습니다. https://github.com/DHuckaby/Prime – HandlerExploit