2014-09-11 2 views
-1

안드로이드에서 쓰레드라는 개념에 고심하고 있습니다. 나는 다음과 같은 코드가 메인 UI 쓰레드와 다른 쓰레드에서 돌아가고 있다고 생각했지만 100 % 확신 할 수는 없다. 그래서 나는 안드로이드 워드 프로세서가 어떤 언어로든 작성된 것처럼 설명을하기 위해 여기에 올 것이라고 생각했다. 아래 코드는 내 코드입니다.이 코드는 메인 UI 스레드와 다른 스레드에서 실행됩니까

public void retrieveImages(final ImagePresenterInt imagepresenter) { 

     storedImages = new ArrayList<Image>(); 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 

       File imagedir = new File("/mnt/shared/images"); 
       File [] myfiles = File.listRoots(); 
       String canread = String.valueOf(imagedir.canRead()); 
       String isfile = String.valueOf(imagedir.isFile()); 
       String isdir = String.valueOf(imagedir.isDirectory()); 

       Log.d("Can Read?","Canread from file :" + canread); 
       Log.d("is file?","Is a file ? :" + isfile); 
       Log.d("is dir?","Is a Dir file :" + isdir); 

       File [] rootfiles =myfiles[0].listFiles(); 

       for (File item : rootfiles) 
       { 
        Log.d(item.getAbsolutePath(),item.getName()); 
       } 

       if(Looper.myLooper() == Looper.getMainLooper()) 
       { 
        Log.d("main thread ?", "YES"); 
       } 
      } 
     }, 2000); 


} 

위의 코드에 대한 이해는 내가 처리기를 생성한다는 것입니다. 이는 주 스레드 또는 UI 스레드와 관련됩니다. 메세지 대기 행렬과 루퍼가 연관되어 있습니다. 이 코드는 메시지 대기열로 전달되고 별도의 스레드에서 루퍼에 의해 기본 UI 스레드로 실행됩니다. 나는 여기서 잘못 될 수있다. 하지만 주로이 스레드가 주 스레드에서 실행되고 있는지 알고 싶습니다. 그리고 어떻게 다른 스레드에 그것을 얻을 것이라고하지 않으면? 나는이 질문

How to check if current thread is not main thread

이 분명히 스피 여전히 메인 스레드에서 실행 하더군요에서 발견 된 코드가 다른 스레드 사용하여 코드를 실행되고 있는지 확인하기 위해 노력했다. 귀하의 도움에 감사드립니다

+0

사용중인 스레드에서 업데이트하거나 보거나 ui 항목을 시도하십시오. 오류가 발생하면 주 스레드 또는 UI 스레드가 아닙니다. – Meenal

+0

보기 또는 UI 항목을 업데이트하려고합니까? –

+0

ui item..like imageview 또는 textview – Meenal

답변

0

처리기는 호출 스레드에서 생성됩니다.이 스레드는 아마도 사용자 스레드의 UI 스레드 일 것입니다. 새 스레드를 시작 싶은 경우에, 내가 알고있는 세 가지 가능성이 있습니다 : 첫 번째는 간단한 시작 새로운 스레드이다 : 당신의 활동이 살해됩니다 경우

thread = new Thread() { 
    @Override 
    public void run() { 
    //Do your thing here 
    } 
}; 
thread.start(); 

스레드는 죽을 것이다.() onHandleIntent 때까지 IntentService가 실행됩니다

public class SimpleIntentService extends IntentService { 

    public SimpleIntentService() { 
     super("SimpleIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    //Do your thing here 
    } 

Intent intent = new Intent(this, SimpleIntentService.class); 
intent.putExtra("SomeString", "SomeValueYouNeed"); 
startService(intent); 

통해 시작 수행과보다 가까운 자체 :

두 번째는 IntentService를 정의하는 것이다.

private class TestTask extends AsyncTask<Datatype1, Datatype2, Datatype3>{ 
    protected Long doInBackground(Datatype1... params) { 
    // Do your thing here 
    } 

    protected void onProgressUpdate(Datatype2... progress) { 
     //Do a Progress-Bar or something like that 
    } 

    protected void onPostExecute(Datatype3 result) { 
     //Do something, when your work is done 
    } 
} 

그리고 당신의 활동에 :

세 번째 가능성은 AsyncTask를하다

new TestTask().execute(params); 

워드 프로세서는 매우 긴 calulations위한 비동기 작업을 사용해서는 안됩니다 상태,하지만 난 이유를 밝히지 말라.Intentservice 대신 Asynctask를 사용하면 UI 스레드로 데이터를 다시 가져 오는 것이 더 쉬울 수도 있지만, 나 자신을 위해 자주 사용하지 않으므로 여기에서 물어 보는 것이 가장 좋은 사람은 아닙니다.

편집 : 잊어 버렸다 : IntentService는 전달한 모든 항목에 대해 한 번 실행됩니다. Asynctask는 한 번만 호출 할 수 있습니다.

또한 IntentService는 Manifest에 선언되어야합니다.

+0

asyncTask 클래스가 활동을 당신이 스레드를 호출하는 클래스와 밀접하게 결합하게하고 MVP 패턴을 사용하려고 시도하는 것으로 생각한다. 그래서 확실히 배제된다. 게다가 거기에 Asynctask –

+0

다양한 다른 문제가 있습니다. 그 경우에는 IntentService (또는 귀하의 작업이 외부에서 멈출 수 있어야한다면 스레드가있는 일반 서비스) 가야 겠지요. –

1

retrieveImages()에서 생성 한 Handler은이 함수가 호출 된 스레드에 바인딩됩니다.

The doc on Handler는 말한다 :

기본 생성자 동료 현재 스레드에 대한 루퍼이 핸들러를. 이 스레드에 루퍼가없는 경우이 핸들러는 예외를 throw하도록 메시지를받을 수 없습니다.

UI 스레드에서 retrieveImages()을 호출하면 Handler도 UI 스레드에 바인딩됩니다.

업데이트 : 코드를 다른 스레드에서 실행하려면 가장 쉬운 방법은 AsyncTask을 사용하는 것입니다.

+0

예, retrieveImages()가 UI 스레드에서 호출되었습니다. –

+0

@ user1232726 그래서 질문에 답변을 했습니까? 다른 스레드에서 실행해야하는 경우에는 'AsyncTask'를 사용할 수 있습니다 - 응답 업데이트를 참조하십시오. –

+0

asyncTask가 thight 커플 링을 유발합니다. 어쨌든 나는 그것을 사용했다. 아프지 않을 것 같습니다. –

관련 문제