美文网首页
异步加载-AsyncTask

异步加载-AsyncTask

作者: liut_2016 | 来源:发表于2016-09-01 13:29 被阅读16次

安卓主线程不允许访问网络,子线程不允许更新UI,但Android提供一些好用的异步加载的工具。AsyncTask就是其中之一。

AsyncTask背后原理是基于异步消息处理机制的。

AsyncTask是一个抽象类想要使用它必须先创建子类继承他,在继承时要指定三个泛型参数:

  1. Params 在执行任务时需要穿入的参数,可在任务中使用。

  2. Progress 后台执行任务时的进度单位。

  3. Result 如果任务完成后需要对结果进行返回,则使用这里的泛型作为返回值类型。

如不需要可为Void

示例代码

package xyz.liut.asynctasktest;

import android.os.AsyncTask;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private TextView tv;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv_main);

        new MyAsyncTask().execute("http://www.liut.xyz");

    }

    private class MyAsyncTask extends AsyncTask{

        @Override

        protected void onPreExecute() {

            //任务执行之前调用此处代码

            super.onPreExecute();

        }

        @Override

        protected String doInBackground(String... params) {

            //任务内容,此处为子线程。在此方法内主动调用publishProgress(Void... values)就会自动调用onProgressUpdate(Void... values);

            //此方法必须实现。

            try {

                InputStream is = new URL(params[0]).openStream();

                InputStreamReader isr = new InputStreamReader(is);

                BufferedReader br = new BufferedReader(isr);

                String result = "";

                String line = "";

                while ((line = br.readLine())!=null){

                    result += line;

                }

                Log.d("tag",result);

                return result;

            } catch (MalformedURLException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

            return null;

        }

        @Override

        protected void onProgressUpdate(Void... values) {

             //后台任务中调用publishProgress();这个方法就会被调用。

            super.onProgressUpdate(values);

        }

        @Override

        protected void onPostExecute(String s) {

            //当后台任务执行完毕并通过return语句进行返回时调用此方法,返回的内容会作为参数传递到此方法。可以根据返回的内容进一步操作。此处可以更新UI。

            tv.setText(s);

        }

    }

}

相关文章

  • Android - AsyncTask (SDK 24)

    利用AsyncTask给ListView异步加载图片 实现图文混排 链接 AsyncTask源码分析 知乎

  • 异步加载-AsyncTask

    安卓主线程不允许访问网络,子线程不允许更新UI,但Android提供一些好用的异步加载的工具。AsyncTask就...

  • 自定义AsyncTask

    前言 AsyncTask主要用于异步加载,例如图片之类的加载。 主要方法 protected void onPre...

  • Android:异步加载——AsyncTask详谈

    写在前面 昨天在看Android中的缓存机制,顺带把异步加载任务复习了一遍,尤其是AsyncTask。由于我在一般...

  • Android异步处理

    Android异步处理二:使用AsyncTask异步更新UI界面 概述: AsyncTask是在Android S...

  • AsyncTask相关面试题

    什么是AsyncTask? AsyncTask(异步任务类),比Handler更轻量,更适合简单的异步操作内部实现...

  • AsyncTask 源码分析

    AsyncTask 的使用 Android 提供 AsyncTask 处理异步任务,基于异步消息处理机制,本质上是...

  • AsyncTask总结

    想当然的问题 AsyncTask可以用来异步加载图片等,之前看过很多文章,都是直接在Adapter的getView...

  • Android多线程:AsyncTask的源码解析

    AsyncTask作为Android原生的一个异步加载类,在前几年还是非常流行的,但随着RxJava和RxAndr...

  • 开机壁纸下半部分黑屏2-3秒

    屏蔽掉AsyncTask,将异步改为同步,可能由于机器性能原因导致下半部分黑屏(加载太慢了)。 参考链接:andr...

网友评论

      本文标题:异步加载-AsyncTask

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