扣丁学堂——AsyncTask

一丶代码见本文

二丶课程讲解

扣丁学堂——AsyncTask_第1张图片

扣丁学堂——AsyncTask_第2张图片

这里是AsyncTask的基本方法及运用

public class Async extends AppCompatActivity {

    TextView info;


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

        info = (TextView) findViewById(R.id.info);
    }


    public void asyncTasks(View view) {

       //开始执行异步,可以传上参数,也可以不传
       new Myasync(this).execute();

    }

    /***
     * 通过一个 AsyncTask 实现一个异步任务
     */
    private static class Myasync extends AsyncTask<String, Integer, String> {
        Async as;

        //定义构造方法,用于可以访问 外部类的 UI 组件
        public Myasync(Async activity) {
            as = activity;
        }


        //执行任务之前触发的事件方法,可以在该方法中做一些 初始化工作
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            as.info.setText("任务开始^");
        }

        //执行后台任务的方法,类似于线程,所以不能在该方法中访问UI组件
        @Override
        protected String doInBackground(String... params) {

            for (int i = 0; i < 10; i++) {
                Log.i("ms", i + "");
                publishProgress(i);//更新进度,也就是调用onProgressUpdate方法
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return "sucess";
        }

        //更新进度值
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            as.info.setText("当前的任务值" + values[0]);
        }


        //当doInBackground 方法返回被调用
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            as.info.setText(s);
        }
    }
}

扣丁学堂——AsyncTask_第3张图片

扣丁学堂——AsyncTask_第4张图片

AsyncTask实现下载例子:

1.权限设置

//下载权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

//写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
2.布局

//下载按钮
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="下载图片"
    android:id="@+id/button3"
    android:layout_alignParentTop="true"
    android:onClick="downImages"
    />
//进度条
<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:layout_below="@+id/button3"
    android:layout_centerHorizontal="true"/>
//提示完成下载
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="no date"
    android:id="@+id/vt"
    android:layout_below="@+id/progressBar"
    android:layout_marginTop="67dp"/>
3.MainActivity.java

public class Main1226Activity extends AppCompatActivity {
    private ProgressBar pb;
    private TextView info;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1226);
        pb = (ProgressBar) findViewById(R.id.progressBar);
        info = (TextView) findViewById(R.id.vt);
    }
    /***  * 下载图片  *  * @param v  */  public void downImages(View v) {
        new DownLoadAsyncTask(this).execute("http://img2.3lian.com/img2007/19/33/005.jpg");
    }
    private static class DownLoadAsyncTask extends AsyncTask<String, Integer, Integer> {
        Main1226Activity activity;
        public DownLoadAsyncTask(Main1226Activity downImag) {
            this.activity = downImag;
        }
        //初始化化
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            activity.pb.setProgress(0);
        }
        @Override
        protected Integer doInBackground(String... params) {
            String p = params[0];
            try {
                URL url = new URL(p);
                //打开URL连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                int size = conn.getContentLength();//获取文件大小
                //0 标记表示需要更新最大进度值
                publishProgress(0, size);
                byte[] bytes = new byte[5];
                int len = -1;
                InputStream in = conn.getInputStream();
                FileOutputStream out = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg");
                while ((len = in.read(bytes)) != -1) {
                    out.write(bytes, 0, len);
                    //1 标记更新进度值
                    publishProgress(1, len);
                    out.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 200;
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            switch (values[0]) {
                case 0:
                    activity.pb.setMax(values[1]);
                    break;
                case 1:
                    activity.pb.incrementProgressBy(values[1]);
                    break;
            }
        }
        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            if (integer == 200) {
                activity.info.setText("下载完成");
            }

        }
    }
}

三丶演示效果:

这节就到这里,由于文件存储与流没学,所以理解上有点问题,后期加强




你可能感兴趣的:(异步,AsyncTask,扣丁学堂,异步图片下载)