AsyncTask异步任务及异常处理

package com.example.tyxiong.myapplication;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/*
* ui组件是线程不安全的,所以规定只能主线程更新UI组件的状态.
* ui线程负责用户交互,不能执行耗时操作会ANR
* 解决耗时问题有5种方法.
* 只学了两种,这里讲的是 AsyncTask 异步任务.的方式
* 异步任务适用于简单的异步处理,不需要借助线程和Handler即可完成.
*
* AsyncTask为抽象类,泛型类 形如AsyncTask<Params,Progress,Result> 任务类型 进度类型 结果类型.
* 使用步骤:
*   1继承AsyncTask类,实现自定义子类.,注意需要为类型形参指定类型值
*   2重写4个方法
*           准备方法,进行一些初始化.
*           任务方法 需要执行的任务.
*           更新进度方法
*           结果方法
*
*  异步任务执行过程:首先准备方法-->任务方法(里面可调用publishProgress()更新进度--->系统会回调更新进度方法),
*  任务完成返回的结果会给到--->(回调)结果方法
*
*     3 在UI线程中创建AsyncTask子类对象, 调用execute()方法执行
*
*三个规定:
*   1 AsyncTask对象创建和执行必须在UI线程中进行.
*   2 重写的4个方法由负责系统调用.
*   3 AsyncTask任务只能执行一次.,多次会异常(一个对象只能执行一次,先这样理解.)
* */


/*
* 这里讲一下异常处理,想多少写着,下次补充.
* try{}
* catch()
* {}块
* 1 当try块里有异常抛出,系统产生异常对象,寻找catch()处理异常,异常处理完成,不会回try里异常下一句了,直接catch()后面
* 往下执行.
* 2 try{} catch{} finally{} 用到有物理资源(网络,磁盘文件)要关闭的情况(GC不管这个,GC只负责对象堆.);finally
* 放到最后一个catch{}后面,保证finally总能被执行到(即使try catch里有return; finally执行完-->try/catch的return;结束方法)
* 除了try catch里用到了system.exit()退出应用是例外.finally不会执行到.
* 
* 3 finally里不要放return ,这样会导致rty/catch里的return失效. finally return; 结束方法.
* 4 利用try()来自动关闭资源. 要求被关闭的资源类须实现了Autocloseable/closeable(几乎所有资源都实现了两者之一.)
* 5 closeable只能抛出IOException  Autocloseable可以随便异常都可抛..
* 
* 
*
* */

public class MainActivity extends Activity {

    ProgressDialog pogress;
    private TextView show;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (TextView) findViewById(R.id.show);


    }

    public void go(View view) {
        try {
            new Astask().execute(new URL("http://www.crazyit.org.org/"));//AsyncTask必须在UI线程中创建,执行.

        } catch (MalformedURLException e) {
            Log.e("xxx", "(MalformedURLException)");
            e.printStackTrace();
        }
    }


    class Astask extends AsyncTask<URL, Integer, String> {//指定类型参数实参.
        private static final int MAX = 100;
        private int hasRead = 0;

        @Override
        protected void onPreExecute() {
            pogress = new ProgressDialog(MainActivity.this);//准备方法里初始进度条
            pogress.setMax(MAX);
            pogress.setTitle("正在执行中...");
            pogress.setMessage("任务进行中,请等等...");
            pogress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pogress.setIndeterminate(false);
            pogress.setCancelable(false);
            pogress.show();

            //super.onPreExecute();
        }

        @Override
        protected String doInBackground(final URL... params) {//任务方法


            try {
                StringBuilder sb = new StringBuilder();
                URLConnection connection = params[0].openConnection();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    sb.append(line + "\n");
                    hasRead++;
                    publishProgress(hasRead);//调用方法更新进度,会使用onProgressUpdate()被回调.

                }
                return sb.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;


        }

        @Override
        protected void onProgressUpdate(Integer... values) {//更新进度方法
            // Toast.makeText(MainActivity.this, ""+ values[0], Toast.LENGTH_SHORT).show();
            pogress.setProgress(values[0]);


        }

        @Override
        protected void onPostExecute(String s) {//结果方法, 任务方法执行完成,回调该方法(接收执行结果.)

            pogress.dismiss();//关闭对话框.
            show.setText(s);
            Toast.makeText(MainActivity.this, "onPostExecute>>>", Toast.LENGTH_SHORT).show();

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋葵好吃吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值