Android解决:The content of the adapter has changed but ListView did not receive a notification

项目中的错误,记录一下。

完整的错误信息如下:

大意是说adapter内容已改变,但listview未收到通知,上下文不同步了。

精简一下,我有两个ActivityA和ActivityB。首先打开ActivityA,显示一个列表(listView),然后点击一个按钮startActivityForResult打开了B,B中添加了信息提交后setResult到A。B负责添加数据,添加完数据回到A,通知A重新load一遍远端数据,没问题(不要问我为什么要重新load一遍)。

在Activity A中单独起了一个线程去处理任务(请求远端service获取数据),handler收到message之后启动这个线程t,然后Activity A又startActivityForResult了另一个Activity B(这时候ActivityA已经onPause了,但是线程依然在运行,而且还在handler的callback队列中),当Activity B处理完逻辑setResult给Activity A(并且把自己给finish掉),需要让ActivityA重新请求service数据,也就是说线程t要重新运行一次,这时候handler里面已经有线程t这个对象了,然后就导致了上述的错误(好像这么说很牵强啊),参照CSDN牛人的文章,还是线程与上下文的事。

解决办法,在ActivityA的onPause将线程t从handler的callback中移除(然后handler再次收到同样的请求service的message时会重新将此线程t加入到callback队列中),如下:

 

ActivityA的完整代码如下:

贴首歌在:

新解:

还是上面的错误信息,注意这句:

确保adapter的内容不要在后台线程中修改,只能从UI线程中修改。而我的代码是直接message交给handler去处理的,难道这也算后台线程?于是想到了Runnable对象,它是依附于UI线程的,然后使用了handler.post(new Runnable())的方法,测试成功。

Android坑之java.net.SocketException: Permission denied

OK,不知道这算不算是一个坑,记录一下吧,一上午都过去了。。。

先上代码,简单的网路请求上传图片,做了精简,只留关键部分。
HttpURLConnection请求
一执行到con.getOutputStream()就报错:java.net.SocketException Permission denied刚开始以为代码抄的不好,各种百度,发现没有加权限:

<uses-permission android:name=”android.permission.INTERNET” />

结果加上也不好使,又陆续加了
<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

都不好使。。。后来单开线程请求也不好使(代码已省略)。

然后各种百度找到的都是那几篇文章, 要么是模拟器忘了开sd卡,可是我用的真机啊。。。
然后各种胡思乱想,难道是因为我的手机没root?这倒是跟没有权限的用户执行命令的时候没权限是同样的提示啊。。。难道我的内存卡没有mount?难道我的图片存到了系统空间,我没有权限读?bla bla bla

后来找大神要了段代码,发现跟我写的一样,同样报错。。。
知道后来又搜到了这篇文章:
《Android之EACCES (Permission denied)与Permission denied异常探密》
当中的第二条,permission写的地方不对,检查了我的manifest发现我的permission节写在了application里面(为什么当初我要这么做?我也不知道,为什么别的permission没有报错,我tm怎么知道),然后把所有permission拿出来放到与application平级,终于报的错不一样啦。。。。
java.net.ProtocalException Does not support outputOK,另一个坑走起。