2014-01-10 3 views
0

저는 Android에 비교적 익숙하며 ImageView로 동적으로 생성 된 레이아웃에 비트 맵을로드하는 앱에서 작업합니다. 레이아웃 및 ImageView의 수는 일부 동적 데이터 (예 : API 호출)를 기반으로합니다. 비트 맵을 동적으로 생성하고 주 레이아웃에 추가 한 후에 이러한 이미지 뷰에 비트 맵을로드하려고합니다. 다중 동적 레이아웃을 만들고 여러 비트 맵을로드 할 것이므로 주 스레드에서 동 기적으로 수행 할 수 없습니다. 나는 현재 AsyncTasks를 기반으로하는 솔루션을 사용하고 있지만 효율적인 방법 (Handler/Runnable 사용 가능)이있을 수 있다고 생각합니다.Android : 비트 맵을 동적보기로 로딩

1) 레이아웃을 메인 스레드

for(Event event : events.getEventList()) { 
    // Create an UpdateCalendarUITask to update the UI 
    CalendarUpdateTask calendarTask = new CalendarUpdateTask(this, parentView); 
    calendarTask.execute(event); 
} 

2) 만들기에서 첫 AsyncTask를를 시작하고 채 웁니다 (추가 텍스트 :

현재, 나는 다음과 같은 방법으로 AsyncTasks를 사용하는 솔루션을 구현 한 및 이미지 뷰)를 사용하여 새로 만든 동적 뷰를 레이아웃에 추가하고 완료되면 인터페이스를 사용하여 주 스레드에 콜백합니다.

public class CalendarUpdateTask extends AsyncTask<Event, Void, RelativeLayout> { 

    private final WeakReference<Activity> activityReference; 
    private final WeakReference<ViewGroup> parentViewReference; 
    .... 
    public CalendarUpdateTask(Context context, ViewGroup parentView) { 
    parentViewReference = new WeakReference<ViewGroup>(parentView); 
    activityReference = new WeakReference<Activity>((Activity) context); 
    } 

    @Override 
    protected RelativeLayout doInBackground(Event... params) { 
    myEvent = params[0]; 
    return updateGameView(myEvent); // returns created RelativeLayout 
    } 

    @Override 
    protected void onPostExecute(RelativeLayout result) { 
    super.onPostExecute(result); 
    // Add the Game/Event view to the Events View 
    if(// Reference and nulls checks) { 
     ViewGroup parentView = parentViewReference.get();    
     parentView.addView(result); 
     TaskListener listener = (TaskListener) activityReference.get(); 
     listener.loadImages(myEvent); 
    } 
    } 
    ....  
} 

3) 리스너 함수의 loadImages (...)는 this 유사한 비트 맵()

이 확인 작업을로드 다른 AsyncTask를을 시작합니다. 그러나 비트 맵은 뷰가 생성 될 때까지로드되지 않으므로 이미지로드가 약간 느립니다. 이미지 뷰를 만들 때까지 ImageView에 대한 참조가 없으므로 이전에 호출 할 수 없습니다. 주 스레드에서 항상 시작해야하기 때문에 CalendarUpdateTask에서 두 번째 AsyncTask를 시작할 수 없습니다.

이상적으로 두 작업을 동시에 실행하고 비트 맵을 새 ImageView로로드 할 수 있도록 두 작업이 완료되면 알림이 콜백되도록하는 것이 이상적입니다.

올바른 옵션이 더 정확해야합니까? 미리 감사드립니다.

답변

0

데이터 개체를 추적하려면 ListView 또는 GridViewAdapter이있는 문자를 사용해야합니다. 이러한 내장 클래스는 자동으로 보이는 것을 관리하고 필요시보기를 제공하도록 요청합니다. 즉 ImageView 인스턴스를 만들어야합니다. 이미지로드는 이미지 불러 오기를 시작한 시점과 완료 시점 사이에 보류 뷰가 파손되는 경우가 있으므로주의해야합니다.

+0

그래, ListView를 살펴 봤는데 이것이 가능한 또 다른 해결책이라고 생각합니다. 나는 기본적으로 RelativeLayouts (여러 Text 및 Image 뷰 포함)을 ScrollView에 삽입하기 때문에 사용자 지정 개체로 ListView가 필요하다고 생각합니다. 그 일을하는 방법에 대한 모범이 있습니까? – Xitij

+0

죄송합니다. 공유 할 수있는 예가 없습니다. XML 레이아웃과 어댑터 (가능하면 Loader)를 사용하여 이미지를 직접 가져옵니다. Adapter 또는 기타 리소스에 대한 GoogleIO의 협상 중 일부를 살펴보면 많은 정보가 있습니다. –

+0

각 "항목"보기에 대한 사용자 지정 레이아웃이있는 ListView를 활용하여 살펴본 결과 내가 사용하고있는 것입니다. 도와 주셔서 감사합니다. – Xitij

0

당신의 필요가 할 수있는 다른 라이브러리가보다 특정 뷰에 서버에서 이미지를로드 만 인 경우 :

  1. 범용 이미지 로더.
  2. 구글 발리

이 libs와는 URL 요청이 비트 맵로드됩니다있는보기 및 그들은 또한 이미지 로딩의 다른 지점에서 listners을 제공 할 것입니다. 또한이 lib는 디스크에 캐시 할 수 있으므로 응용 프로그램이 여러 번 다시 가져 오지 않습니다. 키를 이미지의 URL로 사용하고 값을 비트 맵으로 사용하는 해시 맵을 만듭니다.

AsyncTask를 사용하면 백그라운드 스레드에서 실행되지만 여러 AsyncTask가 하나씩 (즉, 동기식으로) 실행되기 때문에 AsyncTask를 사용하면이 특별한 경우에는 좋은 접근 방법이 아닙니다.

이미지를로드하려는 경우 좋은 방법이 될 것입니다.

질문이 있으시면 언제든지 문의하십시오.

+0

로드중인 이미지는 실제로 내 드로어 블 폴더에 저장되지만 서버에 연결될 때까지로드 할 이미지를 알지 못합니다. 그 라이브러리가 과도한 경우 확실하지 않습니다. AsyncTask는 executeOnExecutor 및 ThreadPoolExecutor와 병렬로 실행할 수 있습니까? – Xitij

+0

예, ThreadPoolExecutor를 사용하여 AsyncTasks를 실행하는 방법을 조정할 수 있습니다. –

관련 문제