Android第5天,httpclient,多线程断点续传,进度条,xUtils

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库下载

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值