• AsyncTask


           Android提供的一个轻量级的异步操作类,可以直接继承AsyncTask,在类中直接实现异步操作,并使用接口反馈当前异步操作的执行进度(即可以通过接口线程的进度更新,或者是将
    执行的结果反馈给UI主线程)。
    1.布局文件(使用Scroll可以使TextView在超出限定范围时滚动)
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3 xmlns:tools="http://schemas.android.com/tools"
     4 android:layout_width="match_parent"
     5 android:layout_height="match_parent"
     6 android:orientation="vertical"
     7 tools:context="com.example.administrator.async.MainActivity">
     8 
     9     <Button
    10 android:layout_width="wrap_content"
    11 android:layout_height="wrap_content"
    12 android:text="New Button"
    13 android:id="@+id/button" />
    14 
    15     <ScrollView
    16 android:layout_width="match_parent"
    17 android:layout_height="wrap_content">
    18         <TextView
    19 android:id="@+id/tv"
    20 android:layout_width="wrap_content"
    21 android:layout_height="wrap_content"
    22 android:text="Hello World!" />
    23     </ScrollView>
    24 
    25 </LinearLayout>

    2.AndroidMainfest中设置(添加网络连接权限)

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

    3.class

      1 package com.example.administrator.async;
      2 
      3 import android.os.AsyncTask;
      4 import android.os.Bundle;
      5 import android.support.v7.app.ActionBarActivity;
      6 import android.view.Menu;
      7 import android.view.MenuItem;
      8 import android.view.View;
      9 import android.widget.TextView;
     10 import android.widget.Toast;
     11 
     12 import com.example.administrator.async.R;
     13 
     14 import java.io.BufferedReader;
     15 import java.io.IOException;
     16 import java.io.InputStream;
     17 import java.io.InputStreamReader;
     18 import java.net.MalformedURLException;
     19 import java.net.URL;
     20 import java.net.URLConnection;
     21 
     22 public class MainActivity extends ActionBarActivity {
     23 
     24     TextView tv;
     25 @Override
     26 protected void onCreate(Bundle savedInstanceState) {
     27 super.onCreate(savedInstanceState);
     28 setContentView(R.layout.activity_main);
     29 tv = (TextView) findViewById(R.id.tv);
     30 tv.setOnClickListener(new View.OnClickListener() {
     31 @Override
     32 public void onClick(View v) {
     33                 ReadUrl("http://www.baidu.com");
     34 }
     35         });
     36 }
     37 
     38 public void ReadUrl(String url){
     39 
     40 new AsyncTask<String, Float, String>() {
     41 //<初始化时传入数据的数据类型,处理过程中返回值数据的数据类型,返回结果的数据类型>
     42             //获取返回值后AsyncTask会自动执行回调方法
     43 @Override
     44 //实现一个读取网络数据的功能
     45 protected String doInBackground(String... params) {
     46 //传入的是一个String类型的数组,也就是上面传入的第一个参数类型
     47 //该方法与线程中的run方法很相似,也就是执行后台的操作
     48 //在doInBackGround里只能执行不涉及UI的操作,也就是说涉及UI线程的操作或则说
     49 //和UI主线程的互动只能在下面的回调方法里进行
     50 try {
     51                     URL url = new URL(params[0]);
     52 URLConnection connection = url.openConnection();
     53                     long total = connection.getContentLength();
     54 InputStream ipt = connection.getInputStream();
     55 InputStreamReader reader = new InputStreamReader(ipt);
     56 BufferedReader br = new BufferedReader(reader);
     57 //上述为包装过程
     58 String line;//用来读取一行信息
     59 StringBuilder builder = new StringBuilder();//用来存放和连接读取的所有数据
     60 while((line = br.readLine())!=null){
     61                         builder.append(line);
     62 publishProgress((float)builder.toString().length()/total);
     63 }
     64 //然后要将打开的流依次关闭
     65 br.close();
     66 ipt.close();
     67                     return  builder.toString();//将读取到的数据转化为String类型并返回
     68 } catch (MalformedURLException e) {
     69                     e.printStackTrace();
     70 } catch (IOException e) {
     71                     e.printStackTrace();
     72 }
     73 return null;
     74 }
     75 
     76 @Override
     77 //在当前的AsyncTask执行之前会执行该方法
     78 protected void onPreExecute() {
     79                 Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_SHORT).show();
     80                 super.onPreExecute();
     81 }
     82 
     83 @Override
     84 //当前的AsyncTask结束后会自动调用该方法,传入的参数实际上就是doInBackGround的返回值
     85 protected void onPostExecute(String s) {
     86 super.onPostExecute(s);
     87 tv.setText(s);
     88 }
     89 
     90 @Override
     91 //在当前的AsyncTask执行过程中会执行
     92 protected void onProgressUpdate(Float... values) {
     93                 System.out.println(values);
     94                 super.onProgressUpdate(values);
     95 }
     96 @Override
     97 protected void onCancelled(String s) {
     98 super.onCancelled(s);
     99 }
    100 
    101 @Override
    102 protected void onCancelled() {
    103 super.onCancelled();
    104 }
    105         }.execute(url);//启动,把参数传入,则doInBackGround中传入String数组中的第一个就是传入的参数
    106 }
    107 }
  • 相关阅读:
    等级,
    JS高阶---回调函数
    JS高阶---函数
    JS高阶---对象
    JS高阶---数据、变量、内存
    JS高阶---简介+数据类型
    JS里==和===区别
    vue中assets和static的区别
    vue2.0 实现导航守卫(路由守卫)---登录验证
    exports与module.exports,export与export default 之间的关系和区别
  • 原文地址:https://www.cnblogs.com/qjm253/p/5424769.html
Copyright © 2020-2023  润新知