2011-10-21 3 views
6

Runnable에서 값을 반환 할 수 있습니까? 편집 가능한 페이지에 대한 집중적 인 작업을 한 다음 다시 되돌려 야합니다. 여기 내 모의 코드가있다.Runnable에서 값을 반환 할 수 있습니까?

public class myEditText extends EditText { 
... 
private Editable workOnEditable() { 
    final Editable finalEdit = getText(); 
    Thread mThread = new Thread(new Runnable() { 
     public void run() { 


       //do work 

       //Set Spannables to finalEdit 

     } 
    }); 
    mThread.start(); 
    return finalEdit; 
} 
... 
} 

그래서 분명히 내 첫 번째 문제는 내가 finalEdit을 변경하기 위해 노력하고있어,하지만 그것은 바로, 스레드 안팎에 액세스하기 위해 최종 수있다? 이 작업을 수행하는 올바른 방법은 무엇입니까?

+2

'Runnable' 수 없습니다하지만'Callable' 수 있습니다. 'Executor'와 함께 사용하십시오. –

+0

감사합니다. 데니스입니다. – bwoogie

답변

2

Java에서 Runnable은 값을 "반환"할 수 없습니다.

Android에서는 특히 시나리오 유형을 처리하는 가장 좋은 방법은 AsyncTask입니다. 이것은 범용 클래스이므로 전달할 유형과 onPostExecute 함수에 반환되는 유형을 지정할 수 있습니다.

귀하의 경우 AsyncTask<Editable, Void, TypeToReturn>을 작성하십시오. 예 :

private class YourAsyncTask extends AsyncTask<Editable, Void, Integer> { 
    protected Long doInBackground(Editable... params) { 
     Editable editable = params[0]; 
     // do stuff with Editable 
     return theResult; 
    } 

    protected void onPostExecute(Integer result) { 
     // here you have the result 
    } 
} 
1

다음은 Java에서 "의사 클로저"의 사용을 가리키는 것으로, 은 적합하지 않으므로이이 경우에 해당 될 수 있습니다.


자바는 최종 변수에 저장된 변경 가능 유형을 통한 의사 클로저를 허용합니다.

Java's pseudo-closures by Christopher Martin을 참조하십시오. "Faking it"섹션으로 넘어갑니다. 그는 변경 가능한 유형을 소개합니다. ValueHolder<T> :

private static class ValueHolder<T> { 
    T value; 
} 
... 
final ValueHolder<Integer> i = new ValueHolder<Integer>(); 
... 
i.value = 42; 

해피 코딩.

2

스레드가 workOnEditable() 함수의 끝에서 계속 작동한다는 것을 알았습니까? 동기 응답을 원할 경우 스레드를 제거하십시오. 그렇지 않은 경우, 핸들러를 사용하여 데이터를 다시 주 스레드로 전달하십시오.

0

결과를 얻을 때까지 실행 파일을 게시하고 차단할 수있는 Runnable 주변에 2 개의 유틸리티 메소드를 만들었습니다.

당신은 여기 좀 걸릴 수 있습니다 : https://github.com/Petrakeas/HVTHandler/

관련 문제