时雨小径 May the Spirit be with you

Android Dev notes[1]

这学期要交个Android的Project,我觉得这idea能做出来还是不错的.Let's see.
虽然题目里有1,但我也不知道会不会有2.
应该是在3.0以后的SDK中,main thread里不能直接进行网络访问,否则会抛出android.os.NetworkOnMainThreadException这样一个错误.搜索到的结果中有用通过添加StrictMode实现的,但我在查过SDK中对于StrictMOde的介绍后发现还是不要这样子的好,毕竟这只是适用于开发阶段的解决方法,而禁止main thread访问网络也是出于保证程序流畅性的考虑,于是我又找了其他的解决方案,发现用AsyncTask是比较靠谱的一种,这个API提供另外一个线程来执行需要访问网络的操作,个人理解就是在不影响主线程进行UI操作的同时,这一线程在后台访问网络.
SDK给出的范例中:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

需要访问网络的操作在doInBackground函数中进行,而由于分属于不同的线程,不好直接进行数据交换,因此,与主线程有数据交换的部分操作需要放在onPostExecute中执行.
AsyncTask <para1, para2,="" para3="">这个类有三个参数,第一个是传入doInBackground的参数类型,第二个是显示进度的参数类型,第三个是doInBackground返回的数据类型.
而doInBackground返回的数据就是传入onPostExecute的参数.
差不多就是这样一个关系.