2012-01-10 1 views
0

Android 애플리케이션에는 두 가지 활동이 있습니다.지연없이 백그라운드 스레드에서보기에 대한 데이터를로드 할 때 모범 사례

활동 A는 항목 목록을 표시합니다. 활동 B는 특정 항목에 대한 세부 정보를 보여줍니다.

세부 정보는 largish SQLite 데이터베이스에서로드됩니다. 데이터를 생성하는 데 사용 된 쿼리는 합리적인 전화에서 약 250 ~ 500 밀리 초 걸립니다.

제 질문은 좋은 사용자 환경을 제공하면서 데이터를로드하는 가장 좋은 방법입니다.

현재 활동 B가 생성되면 AsyncTask가 실행됩니다. 작업이 완료되면 여러보기가 만들어지고 화면에 추가됩니다. UI 스레드에 데이터가로드되지 않습니다.

사용자에게 액티비티 B가 멋진 표준 줌 애니메이션으로 열리고 잠시 후 몇 초 후에 뷰가 데이터로 채워집니다. 그것은 작은 쓰레기 IMO를 보인다.

또 다른 옵션은 UI 스레드에 데이터를로드하는 것입니다. 적절한 시간에이 작업을 수행하면 데이터가로드되고 표준 줌 애니메이션으로 뷰가 변경되지만 이미 채워진 뷰로 확대되는 동안 250ms 동안 선택된 목록 항목이 화면에 고정됩니다. 그것은 훨씬 좋네 보이지만 이상적이지 않은 UI 스레드를 차단하고 있습니다.

새보기가 아직 준비되지 않은 상태에서 멋진 전환을 얻는 가장 좋은 방법은 무엇입니까?

+0

데이터로드, 취소 가능성 추가, 가장 중요한 것은 별도의 스레드에서로드하는 동안 진행률 대화 상자를 활동 A 위에 놓습니다. 네트워크 작업이므로 응답을받지 않고 사용자가 작업을 쉽게 취소 할 수 있도록해야합니다. IMHO입니다. – harism

+0

네트워크 작업이 아닙니다. –

답변

2

중 하나는 데이터를로드하는 작업에 대한 progress dialog을 넣고 당신이 다음하지 않으면 ..

당신은 .. intervally UI에 데이터베이스에서 결과 데이터를 업데이트하기위한

protected void onProgressUpdate(Integer... progress) { 
     //this runs in UI thread so its safe to modify the UI 
     myTextField.append("finished call " + progress); 
    } 
당신의 AsyncTaskonProgressUpdate() 방법을 사용할 수 있습니다

•onProgressUpdate - 백그라운드 작업에서 publishProgress가 호출 될 때마다 호출되며 UI로 다시 진행 상황을보고하는 데 사용됩니다. 당신이 LIMIT 및 데이터베이스에서 많은 양의 데이터를 가져 오는에 대한 귀하의 select query에 반환 된 결과의 결합 수와 데이터베이스에서 데이터를 가져 오는에 대한 sqlite databaseOFFSET 절 사용할 수 있습니다 또한

..

예 :

Select * from Animals LIMIT 100 OFFSET 50 
+0

고마워, 그게 실제로 내 유스 케이스에서 정말 좋은 생각이야. 화면의 가장 중요한 부분이 매우 빠르게로드됩니다. –

+0

멋진 답을 얻으려면 다시 +1하세요. –

+0

@ user370305 예. 나는 여러 날 동안 당신을 찾고있었습니다. [chat] (http://chat.stackoverflow.com/rooms/1531/casual-chat)을 갖기 위해 일부 객실에서 방문비를 지불하셔야합니다. –

관련 문제