‘壹’ android 客户端如何实现从服务器下载多图片,就是把自己上传到服务器的所有图片都下载到android客户端
如果你图片太大的话就需要Service一般的话一个线程就可以了‘,在你情况的时候需要你服务器的接口,才能连接
‘贰’ android后台多文件下载怎样实现
可以创建一个服务,然后开启多线程下载。不过不推荐多线程,建议使用单线程排队下载。
‘叁’ android 异步方法和子线程方法有什么区别
子线程没有控制并发数量,当并发过多的时候异步方法的作用就体现出来了。
异步是相对于同步而言的,顾名思义,同步就是各个通讯节点之间有统一的时钟,按照相同的时钟工作,异步相反,各节点之间没有统一的时钟,每个节点按照自己内部的时钟工作。
android在所有Thread当中,有一个Thread,我们称之为UI Thread。UI
Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main
Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI
Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。
‘肆’ android 怎么处理线程安全
UI线程及Android的单线程模型原则当应用启动,系统会创建一个主线程(main thread)。这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,应用和Android的UI组件(components from the Android UI toolkit (components from the android.widget and android.view packages))发生交互。 当App做一些比较重(intensive)的工作的时候,除非合理地实现,否则单线程模型的performance会很poor。特别的是,如果所有的工作都在UI线程,做一些比较耗时的工作比如访问网络或者数据库查询,都会阻塞UI线程,导致事件停止分发(包括绘制事件)。对于用户来说,应用看起来像是卡住了,更坏的情况是,如果UI线程blocked的时间太长(大约超过5秒),用户就会看到ANR(application not responding)的对话框。 另外,Andoid UI toolkit并不是线程安全的,所以不能从非UI线程来操纵UI组件。必须把所有的UI操作放在UI线程里,所以Android的单线程模型有两条原则: 1.不要阻塞UI线程。 2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)。
‘伍’ 如何在Android中实现一个简单连接网络的应用程序
注意:要执行这节课中描述的网络操作,你应用程序的manifest文件中必须包含以下权限:1 2<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>选择一个HTTP客户端 Choose an HTTP Client大多数网络连接的Android应用使用HTTP发送和接受数据,Android包括两个HTTP客户端:HttpURLConnection和Apache HttpClient,它们支持HTTPS,流上传和下载,
可配置的超时,IPv6以及连接池,在android系统版本为“姜饼”(android2.3)或者更高版本的应用程序中,推荐使用HttpURLConnection,更多关于这个主题的讨论,请查看博客Android HTTP 客户端检查网络连接 Check the Network Connection在你的应用试图连接到网络时,应该先检查网络连接是否可用,可以用getActiveNetworkInfo()和isConnected()方法执行检查。记住,设备(手机等设备)可能不在网络连接的范围内,或者用户禁用了Wi-Fi或者移动数据通道。更多关于此主题的讨论,请参看课程管理网络使用
1 2 3 4 5 6 7 8 9 10 11 12publicvoidmyClickHandler(Viewview){...ConnectivityManagerconnMgr=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();if(networkInfo!=null&&networkInfo.isConnected()){// 获取数据}else{// 显示错误}...}在独立线程中执行网络连接 Perform Network Operations on a Separate Thread网络操作涉及不可预知的延迟,为了防止不良的用户体验,通常的做法是从UI中独立出线程去执行网络连接操作。AsyncTask类提供了最简单的从UI线程中独立出一个新任务的方式。
更多关于此主题的讨论,请参看博客多线程性能在下面的代码片段中,myClickHandler()方法执行了new DownloadWebpageTask().execute(stringUrl).DownloadWebpageTask类是AsyncTask的子类,DownloadWebpageTask实现了下面AsyncTask的方法:
doInbackground()会执行downloadUrl()方法,downlaodUrl()方法将网页的URL地址作为参数,并获取和处理网页的内容,当它处理完这些操作,将会返回一个结果字符串。
onPostExecute()接受返回字符串并显示在UI上。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 {privatestaticfinalStringDEBUG_TAG="HttpExample";privateEditTexturlText;privateTextViewtextView;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);urlText=(EditText)findViewById(R.id.myUrl);textView=(TextView)findViewById(R.id.myText);}// 当用户点击按钮,调用AsyncTask// 在试图获取URL时,确保有一个网络连接publicvoidmyClickHandler(Viewview){// 从UI的text字段中得到URLStringstringUrl=urlText.getText().toString();ConnectivityManagerconnMgr=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();if(networkInfo!=null&&networkInfo.isConnected()){newDownloadWebpageText().execute(stringUrl);}else{textView.setText("No network connection available.");}}// 使用AsyncTask创建一个独立于主UI线程之外的任务. 并使用URL字符串创建一个HttpUrlConnection对象。 // 一旦连接建立,AsyncTask则将网页内容作为一个InputStream对象进行下载。// 最终,InputStream对象会被转换为一个字符串对象,并被AsyncTask的onPostExecute方法显示在UI上。{@(String...urls){// 参数来自execute(),调用params[0]得到URLtry{returndownloadUrl(urls[0]);}catch(IOExceptione){return"无法获取网页,URL可能无效!Unable to retrieve web page. URL may be invalid.";}}// onPostExecute显示AsyncTask结果.@(Stringresult){textView.setText(result);}}...}该片段事件顺序如下:1.当用户点击执行myClickHander()方法的按钮时,应用会将指定的URL传递给AsyncTask的子类DownloadWebpageTask。2.AsyncTask的方法doInBackground()调用downloadUrl()。3.downloadUrl()接收到作为字符串参数传递过来的URL,并用它创建一个URL对象。4.使用URL对象创建HttpURLConnection对象。5.一旦创建完HttpURLConnection对象,该对象将会以InputStream对象方式获取网页内容。6.InputStream再通过readIt()方法将流转换为字符。7.最后,AsyncTask的onPostExecute方法将字符显示在主activity的UI。连接并下载数据 Connect and Download Data在你执行网络事务的线程中,你可以使用HttpURLConnection执行GET方法下载数据,在你调用了connect()方法后,你可以通过调用getInputStream()方法得到数据的InputStream对象。
在下面的代码片段中,doInBackground()方法调用了downloadUrl()方法。downloadUrl方法接收给过来的URL,并使用它通过HttpURLConnection对象连接到网络。一旦连接成功,应用将使用getInputStream()方法获得InputStream对象数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31// 给一个URL,建立HttpUrlConnection对象并作为流对象(InputStream)获取网页数据,最后返回一个字符串。privateStringdownloadUrl(Stringmyurl)throwsIOException{InputStreamis=null;// 先显示获取到的前500个字节// 网页内容intlen=500;try{URLurl=newURL(myurl);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setReadTimeout(10000/*milliseconds*/);conn.setConnectTimeout(15000/*milliseconds*/);conn.setRequestMethod("GET");conn.setDoInput(true);// 开始查询conn.connect();intresponse=conn.getResponseCode();Log.d(DEBUG_TAG,"The response is: "+response);is=conn.getInputStream();// 将InputStream转化为stringStringcontentAsString=readIt(is,len);returncontentAsString;// 确保当app用完InputStream对象后关闭它。}finally{if(is!=null){is.close();}}}注意:getResponseCode()方法返回的是连接状态码,它是获取更多关于连接信息的有效方式。状态码200表示连接成功。