1

가능한 중복 :
RuntimeException: Can't create handler inside thread that has not called Looper.prepare()백그라운드 스레드에서 활동 객체를 역 직렬화하는 방법은 무엇입니까?

나는 안드로이드에 자바 직렬화 메커니즘을 사용하여 문제가 있습니다. UI 스레드에서 호출 할 때 그것은 잘 작동하지만, 나는 몇 가지 배경 스레드에서 사용하려고 할 때 얻을 : 프로젝트 성격의 나는 또한 할 수 있어야한다 UI 스레드 (모든 것을 직렬화 할 수

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

때문에 UI가 응답을 멈추지 않도록).

BTW. SimpleXML을 사용하여 백그라운드에서 무언가를 비 직렬화하려고하면 동일한 문제가 발생합니다.

이제 우리는 어디에서나 사용할 수없는 UI 스레드에서 직렬화를 해제합니다 (XML 및 Java 직렬화 모두).

누구든지이 문제에 관해 밝힐 수 있습니까?

편집 :

내가 개체를 직렬화하려면 다음 코드를 사용하고는 UI 스레드에서 호출 할 때 잘 작동합니다.

public Object getObject(String key) throws InvalidClassException { 
    Object result; 
    try { 
     FileInputStream fileIn = context.openFileInput(getPath(key)); 
     ObjectInputStream in = new ObjectInputStream(fileIn); 
     result = in.readObject(); 
     in.close(); 
     fileIn.close(); 
    } catch (InvalidClassException e) { 
     throw new InvalidClassException(e.getMessage()); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException(e); 
    } 
    return result; 
} 

편집 아래 EJP 코멘트에서 언급 한 바와 같이 2

, 나는 활동 객체를 직렬화 복원하고 있습니다. 그래서 나는 내 질문을 바꾸고있다 : 백그라운드 스레드에서 Activity 객체를 역 직렬화하는 방법은? 이 개체를 deserialize하는 것은 성능 문제 (XML은 약 4 초 동안 비 직렬화하는 반면 2 진 deserialization은 0.5 초 미만) 때문에 다소 피할 수있는 옵션입니다. 우리의 애플리케이션을 재 설계 할 수는 있지만 프로젝트의 제약으로 인해 극단적이고 불필요한 복잡성이 필요하다는 것을 알고 있습니다. 이는 실제로 선택 사항이 아닙니다. 모든 큰 변화는 극도로 고통 스럽습니다.

그래서 문제가 조금 명확 해지면 누구에게 아이디어가 있습니까?

의견을 보내 주셔서 감사합니다.

+0

아무도가 않을 것입니다 사용할 수 있습니다 mainthread에 있어야합니다 숟가락은 정확한 코드를 제공하지 않을 것입니다. 당신은 주어진 제안에 기초하여 자신의 두뇌를 약간 적용해야합니다. –

+0

@dinesh 나는 내 자신의 코드를 작성할 수있는 것 이상으로, 여기에 무엇이 잘못 될 수 있는지 몇 가지 제안을 요구합니다. 왜 그렇게 가혹한가? – kajman

+0

배경 스레드에 왜 루퍼가 필요한가요? –

답변

0

코드 전에 Loooper.Prepare();을 시도한 후 Looper.Loop();을 보내 주시면 감사하겠습니다.

뭔가처럼 : 당신이 다른 스레드에서 UI 작업을 할 수 없습니다

Looper.Prepare(); 
//your code 
Looper.Loop(); 
+0

나는 당신의 제안을 시도했으나 문제점은 Looper.Prepare()와 Looper.Loop()을 호출하는 스레드가 Looper.Loop()을 호출하는 라인을 넘길 수 없다는 것이다. (debbuger에서 "stepping" – kajman

+0

하지만 개체가 올바르게 serialize 된 및 모든 예외가 없으므로이 이동하는 좋은 방법 일 수 있습니다. – kajman

0

모든 UI 작업은

는이

runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      code here 

     } 
    }); 
+0

직렬화는 UI 작업이 아닙니다. 개체를 serialize 할 때 UI를 업데이트하지 않습니다. – kajman

+0

에 동의했지만 여기에 액세스 할 수 있습니다. –

관련 문제