Async Task异步实现(一)

本文的主要思路就是:

1、网络上请求数据,申请网络权限 读写存储权限
2、布局我们的layout
3、下载之前我们要做什么  
4、下载中我们要做什么    
5、下载后我们要做什么   

该说不说,上代码!

首先,申请网络权限:

 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后写布局文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="15dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击开始" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello world! imooc." />


</LinearLayout>

布局初始化:

 private void initView() {
        mProgressBar = findViewById(R.id.progressBar);
        mDownloadButton = findViewById(R.id.button);
        mResultTextView = findViewById(R.id.textView);
    }
设置点击监听
 private void setListener() {
        mDownloadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //做下载的事情

            }
        });
    }
初始化UI数据
 private void setData() {
        mProgressBar.setProgress(0);
        mDownloadButton.setText("点击下载");
        mResultTextView.setText("准备下载");
    }

完整的代码如下:

package com.example.asynctaskproject;

import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.content.AsyncTaskLoader;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import org.w3c.dom.Text;

/*
   1、网络上请求数据,申请网络权限 读写存储权限
   2、布局我们的layout
   3、下载之前我们要做什么  UI处理
   4、下载中我们要做什么    数据处理
   5、下载后我们要做什么   UI处理
 */

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private ProgressBar mProgressBar;
    private Button mDownloadButton;
    private TextView mResultTextView;

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

        initView();

        setListener();//设置点击监听

        setData();//初始化UI数据

    }
    /*
          视图初始化
     */
    private void initView() {
        mProgressBar = findViewById(R.id.progressBar);
        mDownloadButton = findViewById(R.id.button);
        mResultTextView = findViewById(R.id.textView);
    }

    private void setListener() {
        mDownloadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //做下载的事情

            }
        });
    }

    private void setData() {
        mProgressBar.setProgress(0);
        mDownloadButton.setText("点击下载");
        mResultTextView.setText("准备下载");
    }

    public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
        /*
          在异步任务之前,在主线程中
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //可操作UI
            mDownloadButton.setText("下载中");
            mResultTextView.setText("下载中");
        }

        //在另外一个线程处理事件
        @Override
        protected Boolean doInBackground(String... param) {
            for (int i=0;i<1000;i++) {
                Log.i(TAG, "doInBackgroud: " + param[0]);
                //抛出进度
                publishProgress(i);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            //也是在主线程中,执行结果 处理
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //收到进度,然后处理,也是在UI进程

        }

        @Override
        protected void onCancelled(Boolean aBoolean) {
            super.onCancelled(aBoolean);
            //
        }

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


版权声明:本文为weixin_58308529原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。