2012-04-07 4 views
1

내 앱용 서버에서 데이터를 가져오고 있습니다. "getData"기능은 응용 프로그램의 기본 활동 인 스플래시 스레드에 포함되어 있습니다. 내가 겪고있는 문제는 다음과 같습니다.스레드를 완료하기 전에 작업이 완료되었는지 확인하는 방법은 무엇입니까?

앱을로드 한 후 신속하게 뉴스 나 설명을 입력하면 모든 정보가로드되지 않은 것으로 나타납니다 (마지막으로 2 개 또는 3 개의 문자열을 저장할 필요가 있음). 그러나 (스플래시 스레드 완료 후) 주 메뉴를 표시 한 후 앱을 몇 초 더 허용하면 문제가 발생하지 않고 모든 정보가 휴대 전화에 올바르게 저장됩니다. 스플래시 화면을 몇 초 지연 시키려고했지만 실제로는 우아한 해결책이 아니며 항상 작동합니다.

내 질문은 "결국"

내가 어떤 데이터베이스에 데이터를 저장하고 있지 않다 점프하기 전에 난 그냥 다른 클래스의 공공 정적 문자열 배열에서, 함수가 완료되었는지 확인 할 수있는 방법입니다.

당신은 아래에있는 내 코드를 가지고 : 더 읽기와 물리적으로 보이는 초기 질문에 코멘트에 논의를 만들기의 목적을 위해

if(networkAvailable()){ 
     Thread splashTread = new Thread() { 
      @Override 
      public void run() { 
       try { 

        getData.execute(description_Hyperlinks); 
        getNews.execute(new String[]{newsJSON_Hyperlink}); 
        getOffers.execute(new String[]{offersJSON_Hyperlink}); 

        for(int i = 0; i<3; i++) 
         Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        finish(); 
        startActivity(new Intent(FlexFormActivity.this, MainMenu.class)); 
        stop(); 
       } 
      } 
     }; 
     splashTread.start(); 
+0

['AsyncTask'] (http://developer.android.com/reference/android/os/AsyncTask)를 사용해야합니다.html). 작업에 대한 작업이 진행될 때 특정 작업을 수행 할 수있는 가능성을 제공합니다. –

+0

getData, getNews 및 getOffers는 AsyncTask 클래스의 인스턴스입니다. – Eugen

+0

그러면 개념을 이해하지 못했을 것입니다. 작업을 수행하는 하나의 'AsyncTask (예 : "LoadContents")를 만드는 것이 더 나은 접근 방법입니다. 이 작업에서는 데이터, 뉴스 및 쿠폰을로드하고 표시 할 수 있습니다. 작업이 끝나면 모든 것이 설정되고 사용자에게 표시 할 수 있습니다. 자바의 executor-framework과 Androids 구현체는 항상 'Thread'를 사용할 필요가있다. –

답변

2

것은


그것은 더 나은 것 AsyncTask-class의 형태로 비동기 작업 처리를위한 Android 빌드 인 지원을 사용하려는 아이디어. 이를 통해 작업을 "후크 (hook in)"할 수 있으므로 진행의 여러 단계에 대해 반응 할 수 있습니다.

아이디어는 getData, getNewsgetOffers 각각 AsyncTask 확장, 오히려 잇달아 데이터, 뉴스 및 이벤트를로드 (예를 들어, "LoadContents"라고도 함) 하나의 작업을하도록하지하는 것입니다.

초기 작업이 모두 완료되면이 "작업 완료"에 대해 쉽게 반응 할 수 있습니다. 어떤 형태로든 상상할 수 있습니다. 약간의 코드 리뷰로


, 일반적으로 자바와 안드로이드 주위 (특히 Java Executor Framework을) 많은 래퍼를 제공하기 때문에 위해 선호되어야하는, 그 자체 -class Thread를 사용할 필요가 전혀 없습니다 더 깨끗하고 신뢰할 수있는 코드를 생성합니다. 또한

(스플래시 스크린이 존재 유지하도록 @Eugen에 의해 사용되는) "백 버튼을 비활성화"에 대한 일반적인 사항과 같이 는하지 마십시오 그것을 할. 애플리케이션을 사용할 때 사용자가 기대하는 행동이 아닙니다.

누군가가 처음 앱을 열었을 때 콘텐츠를 처음로드하는 데 약 10 초가 걸렸으며이 프로세스를 취소 할 수 없다고 상상해보십시오. 사용자는 전체 시간을 기다려야 만 앱을 사용하지 않고 앱을 종료해야합니다.

따라서 뒤로 버튼을 비활성화하지 말고 작업 (따라서 응용 프로그램의 초기로드)을 "취소 가능"으로 설정해야합니다. AsyncTask을 사용할 때 이미 구현되어 있습니다.

+0

시간을내어 답변 해 주셔서 감사합니다. 나는 뒤로 버튼의 덮어 쓰기를 사용하지 않았다. 누군가 나에게 그것을 제안했지만, 또한 나쁜 생각을 발견했다 : D – Eugen

+0

@Eugen 내가 도울 수있어서 기뻤다 : D –

관련 문제