大佬教程收集整理的这篇文章主要介绍了Android带进度条的文件上传示例(使用AsyncTask异步任务),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。
demo运行截图:
AsyncTask是抽象类,子类必须实现抽象方法doInBACkground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传。AsyncTask定义了三种泛型类型Params,Progress和Result。
1、Params 启动任务执行的输入参数,比如http请求的URL,上传文件的路径等;
2、Progress 后台任务执行的百分比;
3、Result 后台执行任务的最终返回结果,比如String。
AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。
1、onPreExecute(),该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
2、doInBACkground(Params...),将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
3、onProgressupdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
4、onPostExecute(Result),在doInBACkground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
主进程中使用下面两行开始异步任务:
doInBACkground()函数中,params[0]和params[1]本别对应execute()的第一个和第二个变量。
private class myTask extends AsyncTask<String,Integer,String>{ @Override protected void onPostExecute(String result) { //最终结果的显示 mTvProgress.setText(result); } @Override protected void onPreExecute() { //开始前的准备工作 mTvProgress.setText("loading..."); } @Override protected void onProgressupdate(Integer... values) { //显示进度 mPgBar.setProgress(values[0]); mTvProgress.setText("loading..." + values[0] + "%"); } @Override protected String doInBACkground(String... params) { //这里params[0]和params[1]是execute传入的两个参数 String filePath = params[0]; String uploadUrl = params[1]; //下面即手机端上传文件的代码 String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); httpURLConnection httpURLConnection = (httpURLConnection) url .openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); httpURLConnection.setrequestMethod("POST"); httpURLConnection.setConnectTimeout(6*1000); httpURLConnection.setrequestProperty("Connection","Keep-Alive"); httpURLConnection.setrequestProperty("Charset","UTF-8"); httpURLConnection.setrequestProperty("Content-Type","multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(httpURLConnection .getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos .writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filePath.subString(filePath.lasTindexOf("/") + 1) + "\"" + end); dos.writeBytes(end); //获取文件总大小 FileInputStream fis = new FileInputStream(filePath); long @R_922_10586@l = fis.available(); byte[] buffer = new byte[8192]; // 8k int count = 0; int length = 0; while ((count = fis.read(buffer)) != -1) { dos.write(buffer,count); //获取进度,调用publishProgress() length += count; publishProgress((int) ((length / (float) @R_922_10586@l) * 100)); //这里是测试时为了演示进度,休眠500毫秒,正常应去掉 Thread.sleep(500); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); InputStream is = httpURLConnection.geTinputStream(); InputStreamReader isr = new InputStreamReader(is,"utf-8"); BufferedReader br = new BufferedReader(isr); @SuppressWarnings("unused") String result = br.readLine(); dos.close(); is.close(); return "上传成功"; }catch (Exception E) { e.printStackTrace(); return "上传失败"; } }
界面中只要一个进度条progressBar 和一个用于显示的TextView即可。
以上就是本文的全部@L_618_63@,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
以上是大佬教程为你收集整理的Android带进度条的文件上传示例(使用AsyncTask异步任务)全部内容,希望文章能够帮你解决Android带进度条的文件上传示例(使用AsyncTask异步任务)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。