2012-11-13 2 views
0

시나리오 : 조금 까다 롭지 만 재미 있습니다. 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; 
    } 
} 

질문 :

다음

코드 (스트라이프 모든 불필요한 코드)입니다
  1. 내가 보는 방법은 ImageAdapter입니다. 여러 번 호출됩니다. 그것을 줄일 수있는 다른 방법이 있습니까?

  2. 어떻게 ImageAdapter 코드를 최적화 할 수 있습니까?

  3. 기타 개선 사항? 당신이 에서 OutOfMemoryException을 얻을 수있는 나는, 그것은 메모리에 이미지를 저장하는 잘못된이다 확실히 말할 수있는 무엇

+0

나는 그것의 이미지 로딩 절반 프라임을 사용하는 것이 좋습니다. ListView 내에서 사용하는 방법에 대한 예제 프로젝트도 있습니다. https://github.com/DHuckaby/Prime – HandlerExploit

답변

1
  1. (처음 2 개 질문) 어댑터 (목록보기)에만 열 제어를하지 않습니다 나타납니다, 그것은 또한 재활용 작업하는 방법을 배우려면. 어댑터에서 getView는 호출 될 때마다 새로운 뷰를 생성하고, 이전 뷰를 사용할 수없는 경우 새로운 뷰를 생성해야합니다. Mark Murphy (commonsware)의 어댑터 here을 확인하십시오.

  2. 코드에서 진행률 대화 상자에서 모든 이미지가 다운로드됩니다. 귀하의 사용자는 아마 마지막까지 모두 볼 수 없을 것이며 그것은 분명히 당신의 기억에 부담이 될 것입니다. JSON과 이미지를 모두로드하지 말고 (JSON을 요청하고 구문 분석 한 다음, 사용자가 볼 수있는 그리드의 양/스크롤에 따라 이미지를 하나씩 비동기 적으로로드하십시오). 이미지 지연로드와 관련하여 많은 논의가있었습니다. 그리고 반드시 Fedor의 answer에서 시작해야합니다.

1

.

이미지와 캐시 방문 Displaying Bitmaps Efficiently

+0

메모리에 캐싱하지 않으면 과도한 비트 맵 디코딩이 발생하여 메모리 부족이 쉽게 발생할 수 있습니다. 가장 좋은 방법은 게시 한 멋진 링크에서 설명한대로 메모리와 디스크 캐시를 모두 사용하는 것입니다. – HandlerExploit

0

시도 this 라이브러리. layz 로딩에 정말 좋습니다.

0

은 안드로이드 LazyImageLoading 검색

행운

관련 문제