Android开发学习

首先,今天一打开adb,发现一直报这个错误:

ADB server didn't ACK

* failed to start daemon *
会发现,就算到platform-tools下面输入 adb -kill server ,再输入adb -start server都没用。

因为,这个问题是因为adb的端口被占用了,到底是哪个2货占用的。可以直接查看端口好,adb的默认端口号是5037,

cmd -> netstat -ano | findstr "5037" ,然后找到是哪个进程占用。然后打开任务管理器,查看是哪个进程。我发现网上有些网友贴出来是tadb.exe占用了这个端口,我的不是这个,发现是金山手机助手占用了这个端口,果断kill,然后好了。


其次,讲讲自己遇到的一个还没有解决的问题:

直接贴出来吧。

Android开发学习

  我的应用每次上拉刷新都会启动一个异步线程类取服务器的数据,因为考虑到客户体验,就没有在AsyncTask的onPreExecute方法里面设置一个转圈的等待时间。所以刷新的时候,切换到其他fregment再刷新,或者在这个listview里面不断上拉启动asynctask异步刷新。更重要的是,每次进来这个fregment的时候,就已经启动了一次刷新的线程去取最新的数据,腾讯新闻也是这样搞的。

  所以,本来担心的问题出现了,就是多线程的操作,你想想,线程A对listview的操作的时候,这个时候线程B又来了,要对listview的数据更新,这个时候,如果线程A通知更新listview里面的数据,就会报上面的错误。顺便说一下,通知更新用adapter.notifyDataSetChanged()方法。

  1. 有网友说,在数据更新之后,要立马通知UI线程对adapter进行notifyDataSetChanged,以免数据不一致。于是在adapter数据有更改的地方,都给它通知更新一下,结果发现了一个奇怪的问题,每个fregment里面的listview数据第一条不见了,找不到原因,折回来,看看其他办法。

  2 . 或者是把数据的更新放到UI线程中,这个方法倒是提醒了我,是不是可以把adatper里面的数据的放入一个缓冲,每次刷新就把数据放缓从里面,再从缓冲里面取出来更新。这样是不是避免了多线程操作数据,不管多少次线程操作数据,我都采取缓冲把数据等到一定程度再通知UI更新。这样会不会用户体验差了点呢?因为线程取数据的时间过程是不可控的,什么时候才把缓冲的数据取呢?怎么保证取的时候线程已经停止写入了呢?又得折回来。

  3. 靠谱一点的方法,是不是得对线程进行管理。如果第一个线程还在运行的话,不让它给我启动第二个线程。java的thread是有isAlive()这个一个方法判断的,但是可惜我在Asynctask里没有找到。

  


你可能感兴趣的:(端口占用,多异步线程操作)