一个异步任务接收两个url下载两个图片
2014-04-18 15:14
246 查看
有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片。
程序的下载任务是这么执行的,先接受url参数,然后调用
这里的downloadImg()方法体没有接收任何参数,只是建立了一个服务器连接请求,然后启动了一个下载的异步任务,DownloadImgTask ,然后我在DownloadImgTask里面,
可以看到在异步任务里,执行完下载user_pic,就会返回true,因此运行结果就是只能显示出用户上传的图片,到那时头像却怎么也加载不出来。后来调试的时候,我只让异步任务下载头像,结果头像可以加载出来,然后认为下载头像没问题。然后这时候我把两部份都下载,也没加什么代码,结果运行的是user_portrait,user_pic都可以加载出来,我以为之前没出来是网络慢的原因,貌似表面成功了,其实我犯了一个隐含的错误。菜鸟就是菜鸟,不过菜鸟还是能发现自身问题的,我只下载头像,头像文件已经被我保存了,所以下次在运行的时候,头像不是下载的,而是从文件中读取的 = = |||。
亏了师兄一句提醒,2个url,一般最好异步任务进行参数设置,让异步任务传进来的参数就是你要下载的url,这样你要传进来的就是个数组了。之前没有参数的传递,只是在异步任务里硬塞2个url,进行下载。
因此把2个url放进一个数组,传给下载方法,并且让异步任务接收启动任务的参数就行了。
总结:针对本例来讲,一部异步任务下载两个图片,必须进行参数设置,因为这样异步任务传入的参数就不是一个string了,而是一个string[ ]了。异步任务的参数很重要滴。。
————————————————————————————————————分割线————————————————————————————————————————
异步任务参数:
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为 doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参 数。
//AsyncTask<>的参数类型由用户设定,这里设为三个String(第一个、第三个很重要,doInBackground()的返回值类型就是onPostExecute()的输入参数类型,二者要统一)
//第一个String代表输入到任务的参数类型,也即是doInBackground()的参数类型
//第二个String代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息
//传递给onProgressUpdate()一般用来更新界面
//第三个String代表任务结束的产出类型,也就是doInBackground()的返回值类型,和onPostExecute()的参数类型
程序的下载任务是这么执行的,先接受url参数,然后调用
imgUrls = infoPack[3]; headerImg_url = infoPack[8]; downloadImg();//根据图片url下载图片
这里的downloadImg()方法体没有接收任何参数,只是建立了一个服务器连接请求,然后启动了一个下载的异步任务,DownloadImgTask ,然后我在DownloadImgTask里面,
private class DownloadImgTask extends AsyncTask<String, String, Boolean>{ private String imgDownloadUrls = imgUrls ; private String head_imgDownloadUrls = headerImg_url ; protected Boolean doInBackground(String... params) { // TODO Auto-generated method stub //在此下载图片 DownloadManager dm = ARUtils.GetDownloadManager(); try { if(dm.downloadImg(imgDownloadUrls, getAppPath() +"/user_pic/"+ users_name +".jpg")) //下载完后,就返回true return true; if(dm.downloadImg(head_imgDownloadUrls, getAppPath() +"/user_portrait/"+users_name+".jpg")) return true; } catch (Exception e){ Log.e(ARUtils.TAG, e.getMessage()); } return false; } protected void onPostExecute(Boolean result) { // 以下代码略。。。。。。 }
可以看到在异步任务里,执行完下载user_pic,就会返回true,因此运行结果就是只能显示出用户上传的图片,到那时头像却怎么也加载不出来。后来调试的时候,我只让异步任务下载头像,结果头像可以加载出来,然后认为下载头像没问题。然后这时候我把两部份都下载,也没加什么代码,结果运行的是user_portrait,user_pic都可以加载出来,我以为之前没出来是网络慢的原因,貌似表面成功了,其实我犯了一个隐含的错误。菜鸟就是菜鸟,不过菜鸟还是能发现自身问题的,我只下载头像,头像文件已经被我保存了,所以下次在运行的时候,头像不是下载的,而是从文件中读取的 = = |||。
亏了师兄一句提醒,2个url,一般最好异步任务进行参数设置,让异步任务传进来的参数就是你要下载的url,这样你要传进来的就是个数组了。之前没有参数的传递,只是在异步任务里硬塞2个url,进行下载。
因此把2个url放进一个数组,传给下载方法,并且让异步任务接收启动任务的参数就行了。
//第一部分,参数传递 imgUrls = infoPack[3];// headerImg_url = infoPack[8]; String downloadImgurl[] ={imgUrls,headerImg_url}; downloadImg(downloadImgurl);//根据图片url下载图片
//第二部分,将参数传递,启动异步任务 public void downloadImg(String[] url){ //这里传入的就是个数组了 String downloadImgurl[] = url; ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()){ DownloadImgTask imgDownTask = new DownloadImgTask(); if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.GINGERBREAD_MR1) { imgDownTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, downloadImgurl ); } else { imgDownTask.execute(downloadImgurl); } } }
//第三部分 private class DownloadImgTask extends AsyncTask<String[], String, Boolean>{//这里启动异步任务的第一个参数就是数组了。就是doInBackGround()接收的参数
private String imgDownloadUrls = imgUrls ; private String head_imgDownloadUrls = headerImg_url ; protected Boolean doInBackground(String[]... params) { // TODO Auto-generated method stub //在此下载图片 DownloadManager dm = ARUtils.GetDownloadManager(); try { //这里我写进了一个if里,只用返回一次值,这样加载图片快很多if(dm.downloadImg(imgDownloadUrls, getAppPath() +"/user_pic/"+ users_name +".jpg") && dm.downloadImg(head_imgDownloadUrls, getAppPath() +"/user_portrait/"+users_name+".jpg")) returntrue; } catch (Exception e){ Log.e(ARUtils.TAG, e.getMessage()); } returnfalse; } protectedvoid onPostExecute(Boolean result) { //略去。。。。 }
总结:针对本例来讲,一部异步任务下载两个图片,必须进行参数设置,因为这样异步任务传入的参数就不是一个string了,而是一个string[ ]了。异步任务的参数很重要滴。。
————————————————————————————————————分割线————————————————————————————————————————
异步任务参数:
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为 doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参 数。
//AsyncTask<>的参数类型由用户设定,这里设为三个String(第一个、第三个很重要,doInBackground()的返回值类型就是onPostExecute()的输入参数类型,二者要统一)
//第一个String代表输入到任务的参数类型,也即是doInBackground()的参数类型
//第二个String代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息
//传递给onProgressUpdate()一般用来更新界面
//第三个String代表任务结束的产出类型,也就是doInBackground()的返回值类型,和onPostExecute()的参数类型
相关文章推荐
- 异步处理任务工具类(AsyncTask)实现多张图片的下载(已知url)
- 使用异步任务下载图片~
- 分享一个Spring MVC 根据图片URL,下载图片的方法
- android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
- 根据Url异步下载图片,并将图片保存到本地
- Android有进度条异步任务下载图片
- 根据一个url从网上下载图片
- android异步任务图片下载(进度条提示进度)
- 异步下载图片的任务
- AsyncTask 异步任务下载网络图片
- 安卓多线程编程系列2:异步任务的使用之使用异步任务带有进度的横向滚动条下载网络图片
- 异步任务下载网络图片
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- Android基于HttpURLConnection的异步下载图片
- 使用异步任务-AsyncTask下载远程图片
- 异步任务下载图片带进度条
- 异步任务下载图片,通过自定义适配器显示在列表
- 如何防止一个url对应的图片重复下载两次
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- Android之AsyncTask异步任务下载网络图片