android 自定义view用canvas接收数据动态画图 图画着画着报空指针错误是什么情况

qq_36398455 2017-10-10 03:01:51
//发数据
for(int i = 0;i<data.length;i++) {
if (data[i] >= 350 && data[i] <= 380) {
view.SetData(data[i]);
}
}

//自定义view接收数据
public void SetData(final int aaa){
new Thread(new Runnable() {
@Override
public void run() {
while(true){ //在线程中不断往集合中增加数据
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(data.size()>MaxDataSize){ //判断集合的长度是否大于最大绘制长度
data.remove(0); //删除头数据
}
data.add(aaa);
Log.i("dcb***---", "run: "+""+aaa);
mh.sendEmptyMessage(0); //发送空消息通知刷新
}
}
}).start();
}

private Handler mh=new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what==0){ //判断接受消息类型
MyView.this.invalidate(); //刷新View
}
};
};

//画图
if(data.size()>1){
for (int i = 1; i < data.size(); i++) { //依次取出数据进行绘制
// int data2 = Integer.parseInt(data.get(i-1))-29;
Log.i("dcb", "onDraw: "+""+i);
canvas.drawLine(xPoint+(i-1)*xScale, yPoint-(data.get(i-1)-350)*yScale/10, xPoint+i*xScale, yPoint-(data.get(i)-350)*yScale/10, paint);



开始画图是正常的,10s钟左右就在画图报最后一句代码说是空指针错误,但是我传入随机生成的整数就能一直画图。
还有一个问题就是 我只传入两个数据,为什么会一直画图呢
求指教
...全文
244 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大海啊全是水 2017-10-11
  • 打赏
  • 举报
回复
你的设计不需要用线程吧,数据没有做同步保护. 不要线程,不要sleep,直接把数据添加到data中,然后sendmessgedelayed
江三木洛 2017-10-11
  • 打赏
  • 举报
回复
引用 3 楼 qq_36398455 的回复:
[quote=引用 2 楼 xw13782513621 的回复:] 1空指针异常:没有加同步锁 在线程里 if(data.size()>MaxDataSize){ //判断集合的长度是否大于最大绘制长度 data.remove(0); //删除头数据 ① } data.add(aaa); ② 最后一句 canvas.drawLine(xPoint+(i-1)*xScale, yPoint-(data.get(i-1)-350)*yScale/10, xPoint+i*xScale, yPoint-(data.get(i)-350)*yScale/10, paint); ③ 因为没有锁,所以执行顺序有可能为①③②,也就是先删除头数据,直接在③取数据,如果是取最后一个,那就空了 2一直画:因为你在线程里while(true)了,那还不是一直跑,无限循环谁知道什么时候条件满足了就去重绘了
请问同步锁是什么,新手不太懂 我把while ture删了之后就没出现过报空指针的错误了,那是不是两边都影响了我取数据呢[/quote] 搜下关键字synchronized看看吧
qq_36398455 2017-10-11
  • 打赏
  • 举报
回复
引用 2 楼 xw13782513621 的回复:
1空指针异常:没有加同步锁 在线程里 if(data.size()>MaxDataSize){ //判断集合的长度是否大于最大绘制长度 data.remove(0); //删除头数据 ① } data.add(aaa); ② 最后一句 canvas.drawLine(xPoint+(i-1)*xScale, yPoint-(data.get(i-1)-350)*yScale/10, xPoint+i*xScale, yPoint-(data.get(i)-350)*yScale/10, paint); ③ 因为没有锁,所以执行顺序有可能为①③②,也就是先删除头数据,直接在③取数据,如果是取最后一个,那就空了 2一直画:因为你在线程里while(true)了,那还不是一直跑,无限循环谁知道什么时候条件满足了就去重绘了
请问同步锁是什么,新手不太懂 我把while ture删了之后就没出现过报空指针的错误了,那是不是两边都影响了我取数据呢
江三木洛 2017-10-10
  • 打赏
  • 举报
回复
1空指针异常:没有加同步锁 在线程里 if(data.size()>MaxDataSize){ //判断集合的长度是否大于最大绘制长度 data.remove(0); //删除头数据 ① } data.add(aaa); ② 最后一句 canvas.drawLine(xPoint+(i-1)*xScale, yPoint-(data.get(i-1)-350)*yScale/10, xPoint+i*xScale, yPoint-(data.get(i)-350)*yScale/10, paint); ③ 因为没有锁,所以执行顺序有可能为①③②,也就是先删除头数据,直接在③取数据,如果是取最后一个,那就空了 2一直画:因为你在线程里while(true)了,那还不是一直跑,无限循环谁知道什么时候条件满足了就去重绘了
qq_36398455 2017-10-10
  • 打赏
  • 举报
回复
多了个while(true)把自己的程序跑死了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧