가능한 중복 :
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 초 미만) 때문에 다소 피할 수있는 옵션입니다. 우리의 애플리케이션을 재 설계 할 수는 있지만 프로젝트의 제약으로 인해 극단적이고 불필요한 복잡성이 필요하다는 것을 알고 있습니다. 이는 실제로 선택 사항이 아닙니다. 모든 큰 변화는 극도로 고통 스럽습니다.
그래서 문제가 조금 명확 해지면 누구에게 아이디어가 있습니까?
의견을 보내 주셔서 감사합니다.
아무도가 않을 것입니다 사용할 수 있습니다 mainthread에 있어야합니다 숟가락은 정확한 코드를 제공하지 않을 것입니다. 당신은 주어진 제안에 기초하여 자신의 두뇌를 약간 적용해야합니다. –
@dinesh 나는 내 자신의 코드를 작성할 수있는 것 이상으로, 여기에 무엇이 잘못 될 수 있는지 몇 가지 제안을 요구합니다. 왜 그렇게 가혹한가? – kajman
배경 스레드에 왜 루퍼가 필요한가요? –