抓住AsyncTask漏洞把情报送进去。
今天终于穿越火线把数据送入AsyncTask的doInBackground中。
我要编写一个通过socket和服务器通信的安卓程序。但是安卓主线程也叫UI线程,由于要操控UI不允许建立socket链接之类的有可能阻塞线程的操作。我决定用安卓特有的AsyncTask来完成(应该是安卓特色吧!)。通过2天对AsyncTask的研究。发现AsyncTask有一个局限。如果要在doInBackground部分进行死循环监听的话。doInBackground一旦启动,主线程就不能再把别的参数送进去执行。doInBackground就像铁桶般难以渗透。试了很多方法都失败了。2天里搞得我茶饭不思。正准备要放弃AsyncTask时候,发现有一个通过向主线程操作ui的方法publishProgress。关于AsyncTask详细介绍我就不啰嗦了。网上资料大把。这里只讲关键的。我也不想贴代码只讲原理。通过大家确实想看代码就“强烈要求”吧。干活在下面:
如果在doInBackground中执行publishProgress(st)后st会被送到onProgressUpdate(st)中。这个操作本来是用来更新进度信息的。貌似只是单向操作如用textView.setText(st)设定外面的ui。但是我发现可以在外面主线程设定textView.setText(st)。在onProgressUpdate(st)里面用textView.getText().toString()读出外面设定的数据。这样情报既然都到达onProgressUpdate了。进入doInBackground那还不是小菜一碟。用个全局变量就搞定。另外我试过用一个变量来沟通内外但是不行。用一个控件来传递参数,我自己也醉了。这算是漏洞,bug。还有这个方法是否有什么安全隐患我还不得而知。大家来讨论吧。
题目是不是太狂,如果有大侠就这没什么了不起请原谅!