美文网首页
AsnycTask异步处理

AsnycTask异步处理

作者: Summer_27d1 | 来源:发表于2018-07-10 19:31 被阅读0次

三种方式:

  1. Handler
    ···
    Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    }
    };
    ···

  2. runOnUIThread()
    ···
    runOnUiThread(new Thread(){
    @Override
    public void run() {
    super.run();
    }
    });
    ···

  3. ASnycTask
    ···
    package com.example.myasnyctask;

import android.os.AsyncTask;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
Button bt, bt2;
TextView tv;
ProgressBar pb;
MyTask myTask;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();

}

public void init() {
    bt = (Button) findViewById(R.id.button);
    bt2 = (Button) findViewById(R.id.button2);
    tv = (TextView) findViewById(R.id.textView);
    pb = (ProgressBar) findViewById(R.id.progressBar);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            myTask = new MyTask();
            //启动任务
            pb.setMax(100);
            pb.setProgress(0);
            myTask.execute("http://192.168.43.204:8080/myasnyctask-debug.apk");
        
        }
    });
}

//泛型1  联网所需数据   泛型2  下载进度  泛型3 下载结果
class MyTask extends AsyncTask<String, Integer, String> {
    @Override//联网前更新UI 顺序1
    protected void onPreExecute() {
        tv.setText("即将开始下载...");
    }

    @Override//联网   顺序2
    protected String doInBackground(String... strings) {
        try {
            URL url = new URL(strings[0]);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setConnectTimeout(10000);
            con.setReadTimeout(10000);
            con.connect();
            if (con.getResponseCode() == 200) {
                InputStream is = con.getInputStream();
                //获取当前需要下载的数据总长度
                int total = con.getContentLength();
                int now = 0;
                File file = new File(Environment.getExternalStorageDirectory() + "1710.apk");
                FileOutputStream fos = new FileOutputStream(file);
                byte buffer[] = new byte[1024];
                int length = 0;
                while ((length = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, length);
                    //累计下载数据的长度
                    now += length;
                    publishProgress((int) (now / (float) total * 100));
                    fos.flush();
                }
                is.close();
                fos.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return "下载已经完成";
    }

    @Override//联网过程中 更新进度UI    顺序2
    protected void onProgressUpdate(Integer... values) {
        tv.setText("当前下载进度:" + values[0] + "%");
        //给进度条设置进度
        pb.setProgress(values[0]);
    }

    @Override//联网结束后更新UI   顺序3
    protected void onPostExecute(String s) {
        tv.setText(s);
    }


    @Override//联网过程中 取消联网   不在顺序里  需要手动调用
    protected void onCancelled() {
        tv.setText("取消'下载");
    }


}

}

···

相关文章

网友评论

      本文标题:AsnycTask异步处理

      本文链接:https://www.haomeiwen.com/subject/rcyqpftx.html