2015-09-25 2 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); 
    } 
} 

Как вы можете видеть, у меня есть способ получить объект canvas. Это связано с тем, что я хочу иметь возможность добавлять материал в представление из другого кода (не в этом классе). Я думаю, что мой код имеет смысл. Я просто хочу нарисовать черный круг!

Когда я запустить приложение, он разбился сразу с 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. Если это действительно проблема, есть ли другой способ, который я могу нарисовать в пользовательском интерфейсе, но без использования доступных ресурсов? Если это не проблема, то что? Я не знаю, почему InvalidClassException имеет отношение к рисованию.

ответ

1

Похоже, что serialVersionUID, поскольку он не был явно определен в коде, был автогенерирован до 8874316054258000122L, что было не то, что ожидалось.

Попробуйте вручную установить serialVersionUID в 0L, как и ожидалось dfa:

private static final long serialVersionUID = 0L; 
+0

Когда я запускаю второй раз, исключение не выбрасывается! Вы можете это объяснить? – Sweeper

+0

Ммм, я считаю, что он автоматически устанавливается в 0L, как и ожидалось dfa, после того, как исключение выбрано – Anto

+0

Мое предложение работает? – Anto

Смежные вопросы