Android第5天,httpclient,多线程断点续传,进度条,xUtils
来源:互联网 发布:a href js 函数 编辑:程序博客网 时间:2024/06/06 01:09
httpclient
- 使用原始的httpclient
public class MainActivity extends Activity { Handler handler = new Handler(){ @Override public void handleMessage(android.os.Message msg) { Toast.makeText(MainActivity.this, (String)msg.obj, 0).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void get(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pass = (EditText) findViewById(R.id.et_pass); final String name = et_name.getText().toString(); final String pass = et_pass.getText().toString(); Thread t = new Thread(){ @Override public void run() { String path = "http://192.168.13.13/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass; HttpClient hc = new DefaultHttpClient(); HttpGet hg = new HttpGet(path); try { HttpResponse hr = hc.execute(hg); StatusLine sl = hr.getStatusLine(); if(sl.getStatusCode() == 200){ HttpEntity he = hr.getEntity(); InputStream is = he.getContent(); String text = Utils.getTextFromStream(is); Message msg = handler.obtainMessage(); msg.obj = text; handler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } public void post(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pass = (EditText) findViewById(R.id.et_pass); final String name = et_name.getText().toString(); final String pass = et_pass.getText().toString(); Thread t = new Thread(){ @Override public void run() { String path = "http://192.168.13.13/Web/servlet/CheckLogin"; HttpClient hc = new DefaultHttpClient(); HttpPost hp = new HttpPost(path); BasicNameValuePair bnvp = new BasicNameValuePair("name", name); BasicNameValuePair bnvp2 = new BasicNameValuePair("pass", pass); List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>(); parameters.add(bnvp); parameters.add(bnvp2); try { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8"); hp.setEntity(entity); HttpResponse hr = hc.execute(hp); if(hr.getStatusLine().getStatusCode() == 200){ InputStream is = hr.getEntity().getContent(); String text = Utils.getTextFromStream(is); Message msg = handler.obtainMessage(); msg.obj = text; handler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); } } }; t.start(); }}
- 使用封装好的AsyncHttpClient,从github上面下载这个库
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void get(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pass = (EditText) findViewById(R.id.et_pass); final String name = et_name.getText().toString(); final String pass = et_pass.getText().toString(); String url = "http://192.168.13.13/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass; AsyncHttpClient ahc = new AsyncHttpClient(); ahc.get(url, new MyResponseHandler()); } public void post(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pass = (EditText) findViewById(R.id.et_pass); final String name = et_name.getText().toString(); final String pass = et_pass.getText().toString(); String url = "http://192.168.13.13/Web/servlet/CheckLogin"; AsyncHttpClient ahc = new AsyncHttpClient(); // 设置请求参数 RequestParams params = new RequestParams(); params.add("name", name); params.add("pass", pass); ahc.post(url, params, new MyResponseHandler()); } class MyResponseHandler extends AsyncHttpResponseHandler{ @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Toast.makeText(MainActivity.this, new String(responseBody), 0).show(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Toast.makeText(MainActivity.this, "请求失败", 0).show(); } } }
多线程断点续传下载
- 自己写代码实现
public class MainActivity extends Activity { static int ThreadCount = 3; static int finishedThread = 0; int currentProgress; String fileName = "QQPlayer.exe"; String path = "http://192.168.13.13:8080/" + fileName; private ProgressBar pb; TextView tv; Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { // 使用long来计算进度,防止文件过大显示出错。 tv.setText((long)pb.getProgress() * 100 / pb.getMax() + "%"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pb = (ProgressBar) findViewById(R.id.pb); tv = (TextView) findViewById(R.id.tv); } public void click(View v){ Thread t = new Thread(){ @Override public void run() { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if(conn.getResponseCode() == 200){ // 获取文件的总长度 int length = conn.getContentLength(); pb.setMax(length); File file = new File(Environment.getExternalStorageDirectory(), fileName); // 读写,并且每次都写入磁盘的方式打开文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); raf.setLength(length); raf.close(); // 计算每个线程需要下载的数据的大小 int size = length / ThreadCount; for (int i = 0; i < ThreadCount; i++) { int startIndex = i * size; int endIndex = (i + 1) * size - 1; // 当不能整除的时候,余数给最后一个线程 if (i == ThreadCount - 1){ endIndex = length - 1; } new DownLoadThread(startIndex, endIndex, i).start(); } } } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } class DownLoadThread extends Thread{ int startIndex; int endIndex; int threadId; public DownLoadThread(int startIndex, int endIndex, int threadId) { super(); this.startIndex = startIndex; this.endIndex = endIndex; this.threadId = threadId; } @Override public void run() { try { File progressFile = new File(Environment.getExternalStorageDirectory(), threadId + ".txt"); // 保存断点的临时文件 if (progressFile.exists()) { FileInputStream fis = new FileInputStream(progressFile); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); // 读取保存的断点进度 int lastProgress = Integer.parseInt(br.readLine()); startIndex += lastProgress; // 获取新的开始位置 currentProgress += lastProgress; pb.setProgress(currentProgress); // 更新进度条的开始位置 handler.sendEmptyMessage(1); fis.close(); } HttpURLConnection conn; URL url = new URL(path); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); // 设置要下载的数据的范围 conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex); // 请求成功 if(conn.getResponseCode() == 206){ InputStream is = conn.getInputStream(); byte[] b = new byte[1024]; int len = 0; int total = 0; File file = new File(Environment.getExternalStorageDirectory(), fileName); RandomAccessFile raf = new RandomAccessFile(file, "rwd"); // 设置开始写入的位置 raf.seek(startIndex); while((len = is.read(b)) != -1){ raf.write(b, 0, len); total += len; // 跟新进度条 currentProgress += len; pb.setProgress(currentProgress); //更新textview handler.sendEmptyMessage(1); // 保存总的下载值到临时文件中,给断点续传使用。 RandomAccessFile progressRaf = new RandomAccessFile(progressFile, "rwd"); progressRaf.write((total + "").getBytes()); progressRaf.close(); } raf.close(); finishedThread++; synchronized (path) { if(finishedThread == ThreadCount){ for (int i = 0; i < ThreadCount; i++) { File f = new File(Environment.getExternalStorageDirectory(), i + ".txt"); f.delete(); } finishedThread = 0; } } } } catch (Exception e) { e.printStackTrace(); } } }}
- 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始下载" android:onClick="click" /> <ProgressBar android:id="@+id/pb" android:layout_width="match_parent" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Horizontal" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
使用xUtils库下载
- 下载xUtils库
public class MainActivity extends Activity { private TextView tv_failure; private TextView tv_progress; private ProgressBar pb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_failure = (TextView) findViewById(R.id.tv_failure); tv_progress = (TextView) findViewById(R.id.tv_progress); pb = (ProgressBar) findViewById(R.id.pb); } public void click(View v){ HttpUtils utils = new HttpUtils(); String fileName = "QQPlayer.exe"; String path = "http://192.168.13.13:8080/" + fileName; utils.download(path, "sdcard/QQPlayer.exe", true, true, new RequestCallBack<File>() { @Override public void onSuccess(ResponseInfo<File> arg0) { Toast.makeText(MainActivity.this, arg0.result.getPath(), 0).show(); } @Override public void onFailure(HttpException arg0, String arg1) { tv_failure.setText(arg1); } @Override public void onLoading(long total, long current, boolean isUploading) { super.onLoading(total, current, isUploading); pb.setMax((int)total); pb.setProgress((int)current); tv_progress.setText(current * 100 / total + "%"); } }); }}
0 0
- Android第5天,httpclient,多线程断点续传,进度条,xUtils
- android 多线程+断点续传+进度条
- 处理多线程,断点续传,下载进度条等问题,xUtils框架
- android 多线程断点续传下载---强大的开源XUtils
- 第五天 HttpClient(get post)多线程下载 (xutils)
- Android XUtils单线程断点续传
- Android多线程+单线程+断点续传+进度条显示下载
- 多线程下载、断点续传、进度条展示
- xUtils断点续传
- Android初级教程XUtils实现“断点续传”下载
- 多线程下载和断点续传和进度条
- 多线程断点续传显示进度条和百分比
- android多线程断点续传
- android多线程断点续传
- Android多线程断点续传
- android 多线程断点续传下载
- android多线程断点续传
- Android多线程断点续传
- 深入理解JavaScript类数组
- JAVA环境变量配置
- 【MyBatis框架】mapper配置文件-foreach标签
- Economy Game
- java关键字static
- Android第5天,httpclient,多线程断点续传,进度条,xUtils
- 优秀博客转载
- Java读取包内包外的配置文件
- Android开发之scrollview嵌套listview相关布局的解析
- [python]urllib3中的连接池--Poolmanager
- maven
- tinyhttpd源码详解 转载自 技术菌的blog
- Android之SurfaceView学习(一)
- 离职信之鸿宇篇