0

Android 앱에서 더 나은 성능을 위해 스레드를 사용하려고했습니다. 내가보기의 일부 설정을 변경 이러한 방법에서Android 스레딩 : 스레드에서 뷰를 참조하십시오.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.play); 

    ... 

    new Thread(new Runnable() { 
     public void run() { 
     makeList(); 
     } 
    }).start(); 

    new Thread(new Runnable() { 
     public void run() { 
     setChronometer(); 
     } 
    }).start(); 
} 

다음 onCreate 방법에 나는 두 개의 스레드를 시작했다. (더 무거운 이벤트 없음)

먼저 크로노 미터 :

ListView
private void setChronometer(){ 
time.post(new Runnable() { 
     public void run() { 
     time.setFormat("Time: %s"); 
     time.setBase(SystemClock.elapsedRealtime()); 
     time.start(); 
     } 
     }); 
} 

두 번째로 다음 ChronometermakeList()에서 작업이 완료되지 않은 하지만, 잘 작동

private void makeList(){ 
    ... 
     final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(...); 

     list.post(new Runnable() { 
     public void run() { 
      list.setAdapter(listAdapter); 
      list.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    .... 

     } 
     }); 
} 

.. 그래서 내 ListView가 작동하지 않습니다!

나는 활동이 목록보기를 정의, 시작 크로노 덜 중요하다, 그래서 내가 활동이 더 빨리 시작하는 것을 목표로, 스레드를 연기 할 때

먼저 생각 (더 performat입니다)했다 이게 좋은 생각인가요?

둘째, 왜 내 ListView가 작동하지 않습니까? 내가 list.post(new Runnable() { 을 제거하면 작동하지만, 안드로이드에서 좋은 방법이 아니라고 생각했습니다. 이제 뷰가 ​​스레드에서 지시를 변경하게됩니다.

셋째, 스레드를 사용해야 할 때 vs.View.post?

도움이 될 것입니다. 감사합니다. FireDragon

+0

텍스트에 백틱 (')을 사용하지 말고 (') 백틱은 마크 다운에서 특별한 의미가 있으므로 사용하지 마십시오. –

답변

1

제일 먼저 기억해야 할

인사말입니다 당신의 UI의 요소 - 당신의 View들과 ListView의 등 - 오직 당신의 UI 스레드 (즉, 메인 스레드)에 액세스해야합니다. 백그라운드 스레드에서 UI를 수정하려면 Handler (UI 스레드에서)을 인스턴스화하고 백그라운드 스레드에서 메시지 및/또는 실행 파일을 보내야합니다.

조금 지저분한가요? 다행히 Android에는 AsyncTask이라는 매우 강력한 클래스가 포함되어 있습니다. 정확히 바쁜 학습에 필요한 것입니다. 이 doInBackground() 회원의에서 당신은 당신의 배경 스레드 코드를 넣어, 당신은 onPostExecute()에서 UI 업데이트를 수행하고, 오 - 그래서 - 훨씬 간단 new Thread()Handler의 등

+0

필자가 붙여 넣은 코드는 백그라운드 스레드를 수행하는 데 필요한 * 것을 표시하지 않습니다. 어댑터 설정 등은 모두 UI init이며 UI 스레드에 있어야합니다. 그러나 스토리지에서 또는 네트워크를 통해 데이터를로드하는 경우 - 모든 종류의 느린 I/O - * 그 이유는 백그라운드에서 수행해야하는 작업입니다. –

+0

오키, 답변 해 주셔서 감사합니다! – FireDragon

0

르우벤은 AsyncTask를 대한 권리와 주변 하구에 비해입니다. 그러나 스레딩의 작동 방식을 이해하려면 various approaches on blog을 자세히 설명했습니다. AsyncTask는가는 길입니다.

관련 문제