1

可能重複:
RuntimeException: Can't create handler inside thread that has not called Looper.prepare()如何在後臺線程中反序列化Activity對象?

我有在Android中使用Java序列化機制的問題。它運作良好,從UI線程調用時,但是當我試圖從一些後臺線程使用它我得到:

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

由於項目性質的,我不能反序列化UI線程(一切也應該可以做它在後臺,所以用戶界面不會停止響應)。

順便說一句。當我嘗試使用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; 
} 

編輯2

如下面EJP評論中提及,我反序列化活動對象。所以我改變我的questuion:如何反序列化後臺線程中的Activity對象? 由於性能問題(XML在大約4s內反序列化,而二進制反序列化小於0.5s),不反序列化此對象是我寧願避免的選項。我知道重新設計我們的應用程序是可能的,但是由於項目限制,這是極端的和不必要的複雜性,這不是一個真正的選擇。每一個更大的改變都是非常痛苦的。

所以當問題更清晰 - 有沒有人有一些想法?

感謝您的任何建議。

+0

沒有人會去勺餵你,並不會提供你確切的代碼。你必須在給定的建議的基礎上適用一點你自己的大腦。 –

+0

@dinesh我不僅能夠寫我自己的代碼,只是要求一些建議,這裏可能是錯誤的。爲什麼這麼苛刻? – kajman

+0

爲什麼在後臺線程中需要Looper? –

回答

0

嘗試並致電Loooper.Prepare();之前您的代碼和 Looper.Loop();之後,爲我工作。

喜歡的東西:

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

我試過你的建議,但問題是,我稱之爲Looper.Prepare()和Looper.Loop()的線程無法通過我稱之爲Looper.Loop()的行(在debbuger中它說「步進」將不會通過該行) – kajman

+0

但對象序列化正確,沒有任何例外,所以這可能是一個好方法。 – kajman

0

你不能在任何其他線程做UI操作 所有的UI操作應該是mainthread

您可以使用此

runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      code here 

     } 
    }); 
+0

序列化不是一個UI操作。序列化對象時,我不更新我的UI。 – kajman

+0

已同意,但您可能正在訪問此處指的是您的用戶界面部分 –