异步加载-AsyncTask

2016-09-01  本文已影响16人  liut_2016

安卓主线程不允许访问网络,子线程不允许更新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);

        }

    }

}
上一篇下一篇

猜你喜欢

热点阅读