视图上的空指针

时间:2011-02-11 18:25:38

标签: android

最近,为了将手机与无线传感器网络集成,我已经调整了一个类作为活动以及一个从串行端口读取的监听器类,并将一些读数绘制到基于简单画布的View上。 我最初尝试使用更普通的消息处理程序和线程构建一个线程画布,更新和无效但是存储我需要绘制的读数的类也在处理一个侦听USB端口的线程。我当时无法让它工作,我决定我可能不需要不断更新画布,因为我只需要用新的读数来更新它。

所以活动类如下。

public class Oscilloscope extends Activity implements MessageListener 

Graph graph;
boolean guard=false;
MoteIF mote;
Data data;
String comm;
static String writeLog;
public Vector <Integer>  arrayvals = new Vector<Integer>();


public Oscilloscope(String comm, String writelog)
{
    this.comm = comm;
    this.writeLog = writelog;
}

public Oscilloscope()
{

}


public void onCreate(Bundle b)
{
    super.onCreate(b);
    graph = new Graph(this);
    this.setContentView(graph);
    if(guard==false)
    {
        create("dummy:1",null).run();
    }

}
synchronized public void messageReceived(int dest_addr, Message msg) {
    if (msg instanceof OscilloscopeMsg) {
        OscilloscopeMsg omsg = (OscilloscopeMsg)msg;



        periodUpdate(omsg.get_version(), omsg.get_interval());
        data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings());

        List temp1 = Arrays.asList(omsg.get_readings());
        Vector<Integer> temp= new Vector<Integer>(temp1);

        this.arrayvals = temp;
        Paint p = new Paint();
        p.setColor(Color.BLUE);

        this.graph.update();
        this.graph.invalidate();

    }
}
public Oscilloscope create(String a, String b)
{
    guard = true;
    Oscilloscope os = new Oscilloscope(a,b);
    os.guard = true;
    return os;
}

不知道为什么我不能让代码括号在那里正常工作,我道歉。 类中还有其他方法,但类本身应该减去视图部分,特别注意messagereceived方法,其中读数作为int数组读入。 我的问题是,一旦调用了onDraw方法,然后调用了messagereceived,之后图形对象似乎为null,当我尝试调用update时,显然会抛出空指针。我可能没有看到一些非常明显的东西。 图形代码非常简单,如下所示:

public class Graph extends View 
    Paint paint= new Paint();
    public float x;
    public float y;
    Vector<CoOrdinate> coVec = new Vector<CoOrdinate>();

    public Graph(Context context) {
        super(context);
    }

    public void onDraw(Canvas canvas)
    {


            Log.v("Line 28 Graph.java","Y: "+y+"X: "+x);
            canvas.drawCircle(x, y, 2, paint);
            Log.v(this.toString(),"onDraw in the graph");

    }

    public void update()
    {
        Log.v("Line 31 of Graph.java","");
        x+=100;
        y+=100;
        paint.setColor(Color.GREEN);
    }
}

任何帮助表示赞赏。感谢。

02-11 19:03:00.933: DEBUG/AndroidRuntime(301): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
02-11 19:03:00.933: DEBUG/AndroidRuntime(301): CheckJNI is ON
02-11 19:03:02.012: DEBUG/AndroidRuntime(301): --- registering native functions ---
02-11 19:03:03.942: INFO/ActivityManager(60): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=graphAndroid.graphs/.Oscilloscope }
02-11 19:03:04.062: DEBUG/AndroidRuntime(301): Shutting down VM
02-11 19:03:04.082: DEBUG/jdwp(301): adbd disconnected
02-11 19:03:04.122: INFO/AndroidRuntime(301): NOTE: attach of thread 'Binder Thread #3' failed
02-11 19:03:04.263: INFO/ActivityManager(60): Start proc graphAndroid.graphs for activity graphAndroid.graphs/.Oscilloscope: pid=308 uid=10040 gids={1015}
02-11 19:03:05.263: INFO/ARMAssembler(60): generated scanline__00000077:03545404_00000004_00000000 [ 47 ipp] (67 ins) at [0x361990:0x361a9c] in 6676000 ns
02-11 19:03:05.493: INFO/System.out(308): Creating dummy source (dummy:1)
02-11 19:03:05.493: INFO/System.out(308): No Motes:1
02-11 19:03:05.503: VERBOSE/Line 129 Oscilloscope.java(308): Made it to here
02-11 19:03:05.503: VERBOSE/Line 135 Oscilloscope.java(308): Made it here
02-11 19:03:05.513: VERBOSE/Line 137 Oscilloscope.java(308): Made it here
02-11 19:03:05.513: VERBOSE/Line 114 MoteIF.java(308): Third constructor
02-11 19:03:05.513: VERBOSE/Line 121 MoteIF.java(308): Made it here
02-11 19:03:05.513: VERBOSE/Line 123 MoteIF.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 127 MoteIF.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 130 MoteIF.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 69 PhoenixSource.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 71 PhoenixSource.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 74 PhoenixSource.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 133 MoteIF.java(308): Made it here
02-11 19:03:05.523: VERBOSE/Line 138 MoteIF.java(308): Made it here
02-11 19:03:05.533: VERBOSE/Line 140 MoteIF.java(308): Made it here
02-11 19:03:05.543: VERBOSE/Line 142 MoteIF.java(308): Made it here
02-11 19:03:05.543: VERBOSE/Line 138 Oscilloscope.java(308): Made it here
02-11 19:03:05.543: VERBOSE/Line 140 Oscilloscope.java(308): Made it to here
02-11 19:03:05.783: VERBOSE/Line 28 Graph.java(308): Y: 0.0X: 0.0
02-11 19:03:05.793: VERBOSE/graphAndroid.graphs.Graph@43e3deb8(308): onDraw in the graph
02-11 19:03:05.823: INFO/ActivityManager(60): Displayed activity graphAndroid.graphs/.Oscilloscope: 1679 ms (total 1679 ms)
02-11 19:03:07.543: INFO/System.out(308): SimulatedOscilloscopePacketSource moteId is 0
02-11 19:03:07.543: VERBOSE/1(308): A test, line 424 OscilloscopeMsg class
02-11 19:03:07.543: WARN/dalvikvm(308): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
02-11 19:03:07.563: ERROR/AndroidRuntime(308): FATAL EXCEPTION: Thread-8
02-11 19:03:07.563: ERROR/AndroidRuntime(308): java.lang.NullPointerException
02-11 19:03:07.563: ERROR/AndroidRuntime(308):     at graphAndroid.graphs.Oscilloscope.messageReceived(Oscilloscope.java:108)
02-11 19:03:07.563: ERROR/AndroidRuntime(308):     at net.tinyos.message.Receiver.packetReceived(Receiver.java:210)
02-11 19:03:07.563: ERROR/AndroidRuntime(308):     at net.tinyos.packet.PhoenixSource.dispatch(PhoenixSource.java:165)
02-11 19:03:07.563: ERROR/AndroidRuntime(308):     at net.tinyos.packet.PhoenixSource.packetDipatchLoop(PhoenixSource.java:157)
02-11 19:03:07.563: ERROR/AndroidRuntime(308):     at net.tinyos.packet.PhoenixSource.run(PhoenixSource.java:174)
02-11 19:03:07.613: WARN/ActivityManager(60):   Force finishing activity graphAndroid.graphs/.Oscilloscope
02-11 19:03:07.932: WARN/IInputConnectionWrapper(129): showStatusIcon on inactive InputConnection
02-11 19:03:08.463: INFO/ARMAssembler(60): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x36b288:0x36b344] in 746000 ns

2 个答案:

答案 0 :(得分:0)

由于graph初始化onCreate,新线程中的graph字段将为null,因为onCreate仅针对活动调用。我认为这是事故的直接原因。

我可能会将该类重写为两个类(一个Activity,一个线程)以避免混淆;但是如果你想保持相同的通用结构,我建议你为Oscilloscope添加第二个构造函数,它将把Graph和任何其他共享成员作为参数。在create中调用此构造函数,以确保传入共享字段。(然后在必要时进行同步时要非常小心......)

编辑:进一步检查:图表对象传递到setContentView中的onCreate。这意味着您必须尝试在其他线程中使用它。请查看使用MessageQueues和Handlers回发到UI线程,从那里您可以安全地更新图表。

顺便说一下,你似乎没有在任何地方保存对新线程的引用。我认为这意味着新线程可以随时进行垃圾收集。

答案 1 :(得分:0)

创建活动后,您将创建它的另一个实例(在create(string,string)中),但永远不会在该新实例上调用onCreate。所以现在,当在该新实例上调用messageReceived时,graph对象从未被实例化,并且您获得了空指针异常。