• Android网络操作与流行框架(三)——AsyncTask异步任务


    一、异步任务简介

    1、异步&同步定义

    AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部类封装了handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使AsyncTask内部封装好的几个方法实现

    2、AsyncTask参数介绍(三个参数)

    • Params: 开始异步任务执行时传入的参数类型,对应excute()中传递参数
    • Progress:异步任务执行过程中,返回下载进度值的类型
    • Result:异步任务执行完成后,返回的结果类型,与dolnBackground()的返回值类型保持一致

    3、核心方法

    • execute() 执行
    • onPreExecute() 在执行之前
    • doInBackground() 相当于子线程 耗时操作在这个里边执行, 处理UI问题不行
    • onProgressUpdate() 处理进度更新,可以操作UI
    • onPostExecute() 接收线程任务的执行结果(doInBackground结果)
    • onCancelled() 在执行过程中被取消( onPostExecute和onCancelled只会执行一个)

    4、使用步骤

    • 创建AsyncTask子类&根据需求实现核心方法
    • 创建AsyncTask子类的实例对象(即:任务实例)
    • 手动调用execute() 从而执行异步线程任务

    案例:

    activity_asynctask.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical">
    6. <Button
    7. android:id="@+id/button5"
    8. android:layout_width="match_parent"
    9. android:layout_height="wrap_content"
    10. android:text="点击启动异步任务,开始请求服务器" />
    11. <TextView
    12. android:id="@+id/textView"
    13. android:layout_width="match_parent"
    14. android:layout_height="wrap_content"
    15. android:text="Hello~~~" />
    16. </LinearLayout>

    AsyncTaskActivity.java

    1. package com.example.timerdemo;
    2. import android.os.AsyncTask;
    3. import android.os.Bundle;
    4. import android.util.Log;
    5. import android.view.View;
    6. import android.widget.Button;
    7. import android.widget.TextView;
    8. import androidx.annotation.Nullable;
    9. import androidx.appcompat.app.AppCompatActivity;
    10. import java.io.ByteArrayOutputStream;
    11. import java.io.IOException;
    12. import java.io.InputStream;
    13. import java.net.HttpURLConnection;
    14. import java.net.MalformedURLException;
    15. import java.net.URL;
    16. // 请求服务器,将响应显示在界面中
    17. public class AsyncTaskActivity extends AppCompatActivity {
    18. private String TAG = "AsyncTask";
    19. private Button button;
    20. private TextView textView;
    21. @Override
    22. protected void onCreate(@Nullable Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_asynctask);
    25. button = findViewById(R.id.button5);
    26. textView = findViewById(R.id.textView);
    27. button.setOnClickListener(new View.OnClickListener() {
    28. @Override
    29. public void onClick(View view) {
    30. // 实例化AsyncTask
    31. Log.i(TAG, "onClick: 点击按钮~!~");
    32. MyTask myTask = new MyTask();
    33. myTask.execute("http://www.imooc.com/api/teacher?type=3&cid=1");
    34. }
    35. });
    36. }
    37. // execute方法的参数:通常如果是请求服务器的话,那么这个参数我们会传入服务器接口地址
    38. // MyTask task = new MyTask();
    39. // task.execute("http://.....................");
    40. // http://www.imooc.com/api/teacher?type=3&cid=1
    41. class MyTask extends AsyncTask<String, Void, String> {
    42. @Override
    43. protected void onPreExecute() {
    44. super.onPreExecute();
    45. Log.i(TAG, "onPreExecute: 执行了");
    46. }
    47. // 请求服务器 可变长度取值按下标取
    48. @Override
    49. protected String doInBackground(String... strings) {
    50. try {
    51. URL url = new URL(strings[0]);
    52. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    53. conn.setRequestMethod("GET");
    54. conn.setConnectTimeout(6000);
    55. if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
    56. InputStream in = conn.getInputStream();
    57. byte[] b = new byte[1024];
    58. int len = 0;
    59. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    60. while ((len = in.read(b))>-1){
    61. baos.write(b, 0, len);
    62. }
    63. String msg = new String(baos.toByteArray());
    64. Log.i(TAG, "doInBackground: " + msg);
    65. return msg;
    66. }
    67. } catch (MalformedURLException e) {
    68. e.printStackTrace();
    69. } catch (IOException e) {
    70. e.printStackTrace();
    71. }
    72. return null;
    73. }
    74. // 处理显示问题
    75. @Override
    76. protected void onPostExecute(String s) {
    77. super.onPostExecute(s);
    78. Log.i(TAG, "onPostExecute: 执行了");
    79. if(s != null){
    80. textView.setText(s);
    81. }
    82. }
    83. }
    84. }

    结果:

    案例2:进度条

    activity_main.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. <TextView
    9. android:id="@+id/textView"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"
    12. android:text="未开始下载"
    13. app:layout_constraintEnd_toEndOf="parent"
    14. app:layout_constraintStart_toStartOf="parent"
    15. app:layout_constraintTop_toTopOf="parent" />
    16. <Button
    17. android:id="@+id/button"
    18. android:layout_width="match_parent"
    19. android:layout_height="wrap_content"
    20. android:text="启动一个异步任务"
    21. app:layout_constraintEnd_toEndOf="parent"
    22. app:layout_constraintStart_toStartOf="parent"
    23. app:layout_constraintTop_toBottomOf="@+id/textView"/>
    24. <Button
    25. android:id="@+id/button2"
    26. android:layout_width="match_parent"
    27. android:layout_height="wrap_content"
    28. android:text="取消当前异步任务"
    29. app:layout_constraintEnd_toEndOf="parent"
    30. app:layout_constraintStart_toStartOf="parent"
    31. app:layout_constraintTop_toBottomOf="@+id/button" />
    32. <ProgressBar
    33. android:id="@+id/pgb"
    34. android:layout_width="match_parent"
    35. android:layout_height="wrap_content"
    36. style="?android:attr/progressBarStyleHorizontal"
    37. app:layout_constraintTop_toBottomOf="@+id/button2"/>
    38. </androidx.constraintlayout.widget.ConstraintLayout>

    MainActivity.java

    1. package com.example.asynctaskdemo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.AsyncTask;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.widget.Button;
    7. import android.widget.ProgressBar;
    8. import android.widget.TextView;
    9. import java.nio.channels.AsynchronousByteChannel;
    10. public class MainActivity extends AppCompatActivity {
    11. private TextView textView;
    12. private Button button1, button2;
    13. private ProgressBar progressBar;
    14. private AsyncTask<Void, Integer, String> pTask;
    15. @Override
    16. protected void onCreate(Bundle savedInstanceState) {
    17. super.onCreate(savedInstanceState);
    18. setContentView(R.layout.activity_main);
    19. textView = findViewById(R.id.textView);
    20. button1 = findViewById(R.id.button);
    21. button2 = findViewById(R.id.button2);
    22. progressBar = findViewById(R.id.pgb);
    23. pTask = new ProgressTask();
    24. button1.setOnClickListener(new View.OnClickListener() {
    25. @Override
    26. public void onClick(View view) {
    27. pTask.execute();
    28. }
    29. });
    30. button2.setOnClickListener(new View.OnClickListener() {
    31. @Override
    32. public void onClick(View view) {
    33. pTask.cancel(true);
    34. }
    35. });
    36. }
    37. class ProgressTask extends AsyncTask<Void, Integer, String> {
    38. @Override
    39. protected void onPreExecute() {
    40. super.onPreExecute();
    41. }
    42. @Override
    43. protected String doInBackground(Void... voids) {
    44. try {
    45. for(int i = 1; i <= 3; i++){
    46. publishProgress(i);
    47. Thread.sleep(3000);
    48. }
    49. return "sss";
    50. }catch (InterruptedException e) {
    51. e.printStackTrace();
    52. }
    53. return null;
    54. }
    55. @Override
    56. protected void onProgressUpdate(Integer... values) {
    57. super.onProgressUpdate(values);
    58. progressBar.setProgress(100/3*values[0]);
    59. textView.setText("正在下载第" + values[0] + "个文件");
    60. }
    61. @Override
    62. protected void onPostExecute(String s) {
    63. super.onPostExecute(s);
    64. if(s != null){
    65. textView.setText("下载完成");
    66. }
    67. }
    68. @Override
    69. protected void onCancelled() {
    70. super.onCancelled();
    71. textView.setText("已暂停");
    72. }
    73. }
    74. }

    坐得住板凳,耐得住寂寞,守得住初心! 

  • 相关阅读:
    java-php-python-ssm-快递代收系统-计算机毕业设计
    C- strncmp() & strncpy()
    你了解专利的快速预审嘛?
    3.1. 数学函数
    JavaScript 界的巨大动荡 微软提议:将 TypeScript 作为注释
    03. Springboot集成Mybatis-flex(一)
    学习视觉SLAM需要会些什么?
    【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
    【LeetCode每日一题】【单调栈】907. 子数组的最小值之和 Java实现
    撰寫自己的Python C擴展!
  • 原文地址:https://blog.csdn.net/weixin_40352715/article/details/125436617