AsyncTask

来源:互联网 发布:mac战网该服务器 编辑:程序博客网 时间:2024/06/03 23:02
package com.example.kson.asynctaskdemos;


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;


import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class AsyncTaskActivity extends AppCompatActivity {
    private ImageView mImgIv;
    private ProgressBar mProgressBar;
    private TextView mProgressTv;
    private LinearLayout mProgressLayout;
    private Bitmap mBitmap;
    private String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1502264113683&di=28e9111d7609c9a97822fd0fd38cb26e&imgtype=0&src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201510%2F08%2F20151008112359_CYhWz.jpeg";


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


        initData();


        new MyAsyncTask().execute(url);
    }


    private void initData() {


        mProgressBar.setMax(100);


    }


    private void initView() {
        mImgIv = (ImageView) findViewById(R.id.iv_img);
        mProgressBar = (ProgressBar) findViewById(R.id.pb_progress);
        mProgressTv = (TextView) findViewById(R.id.tv_progress);
        mProgressLayout = (LinearLayout) findViewById(R.id.layout_progress);
    }


    class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {


        /**
         * 请求之前运行的方法,用于处理请求之前的逻辑(主线程)
         */
        @Override
        protected void onPreExecute() {
            mProgressLayout.setVisibility(View.VISIBLE);
        }


        /**
         * 请求网络调用的方法(子线程)
         * @param strings
         * @return
         */
        @Override
        protected Bitmap doInBackground(String... strings) {


            try {
                URL url = new URL(strings[0]);


                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
//                //获取返回的数据的总字节长度
                int totalLength = connection.getContentLength();
//                //声明当前的字节长度
                int currLength = 0;
                //转换成当前百分比进度
                int progress = 0;//当前字节数/总的字节数*100
                if (200 == connection.getResponseCode()) {
                    InputStream in = connection.getInputStream();


                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    int length = 0;
                    byte[] buffer = new byte[100];
                    while ((length = in.read(buffer)) != -1) {


                         currLength +=length;


                        progress  = (int) ((float)currLength/totalLength*100);
                        System.out.println("progress===="+progress);
                        Thread.sleep(10);
                        publishProgress(progress);
                        byteArrayOutputStream.write(buffer, 0, length);
                    }
                    return BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size());
                }




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


        /**
         * 请求过程中,进度条的更新(主线程)
         * @param values 进度数值
         */
        @Override
        protected void onProgressUpdate(Integer... values) {


            mProgressBar.setProgress(values[0]);
            mProgressTv.setText(values[0]+"%");


        }


        /**
         * 请求结束后调用的方法,用于更新ui(主线程)
         * @param bitmap
         */
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            mImgIv.setImageBitmap(bitmap);
            mProgressLayout.setVisibility(View.GONE);
        }
    }


    class Mtask extends AsyncTask<Void,Void,Void>{


        @Override
        protected Void doInBackground(Void... voids) {
            return null;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }


        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }


        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
}