2015-09-25 31 views
0

這是我第一次在android上畫東西。我也跟着上developers.android.com教程:繪製圓時出現InvalidClassException。爲什麼?

http://developer.android.com/training/custom-views/custom-drawing.html

很顯然我應該創建一個自定義視圖,並覆蓋onDraw,我可以開始對Canvas參數化繪圖!所以我創建了一個這樣的視圖:

public class CanvasView extends View { 
    private Canvas canvas; 

    public Canvas getCanvas() { 
     return canvas; 
    } 

    public CanvasView (Context c) { 
     super(c); 
    } 

    @Override 
    protected void onDraw (Canvas c) { 
     canvas = c; 
     Paint p = new Paint(); 
     p.setColor (Color.BLACK); 
     c.drawCircle (50, 50, 25, p); 
    } 
} 

正如你所看到的,我有一個獲取畫布對象的方法。這是因爲我希望能夠從其他代碼(不在此類中)向視圖添加東西。我認爲我的代碼很有意義。我只想畫一個黑色的圓圈!

當我運行的應用程序,其與InvalidClassException立即應聲:

java.io.InvalidClassException: dfa; Incompatible class (SUID): dfa: static final long serialVersionUID =8874316054258000122L; but expected dfa: static final long serialVersionUID =0L; 
     at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2383) 
     at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1665) 
     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683) 
     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1806) 
     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963) 
     at com.google.android.apps.plus.service.EsService.c(PG:5140) 
     at com.google.android.apps.plus.service.EsService.b(PG:5064) 
     at com.google.android.apps.plus.service.EsService.a(PG:2522) 
     at com.google.android.apps.plus.service.EsService.c(PG:2613) 
     at com.google.android.apps.plus.service.PackageAddedReceiver.onReceive(PG:37) 
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2488) 
     at android.app.ActivityThread.access$1500(ActivityThread.java:150) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1374) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:213) 
     at android.app.ActivityThread.main(ActivityThread.java:5225) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
     at dalvik.system.NativeStart.main(Native Method) 

我搜索了問題abount InvalidClassException秒,但我什麼也沒發現這樣的。他們都是關於反序列化的東西。我發現這個詞serialVersionUID這與調用堆棧中的序列化相關,但是我的代碼不會對序列化做任何事情!

我認爲這可能是因爲Canvas字段。如果真的是這個問題,有沒有其他的方式可以在UI上繪製東西,但沒有使用可繪製的資源文件?如果這不是問題,那麼是什麼?我不知道爲什麼InvalidClassException與繪畫有關。

回答

1

它看起來像serialVersionUID,因爲它沒有在代碼中明確定義,自動生成到8874316054258000122L,這不是它所期望的。

嘗試將serialVersionUID的手動設置爲0L,如預期dfa

private static final long serialVersionUID = 0L; 
+0

當我跑第二次,不會引發任何異常!你能解釋一下嗎? – Sweeper

+0

嗯,我相信它會自動設置爲0L,正如dfa所預期的那樣,拋出異常後 – Anto

+0

我的建議是否有效? – Anto

相關問題