博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程的基础内容
阅读量:5841 次
发布时间:2019-06-18

本文共 3335 字,大约阅读时间需要 11 分钟。

  hot3.png

多线程的功能:减少堵塞,
处理机制:
过通知机制通知用户使用的活动(activity);在后台线程中处理耗时的操作
1.新建一个线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
new Thread() { // 创建线程
 
    public void run() {
        try {
            while (true) {
                sleep(1000);
                System.out.println(">>>>>>>TISK");
            }
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    };
}.start();
2.AsyncTask的使用
 有三个返回值分别是
 传递的数据类型 返回值数据类型 
返回结果的数据类型
new AsyncTask<String, Float, String>() {// 初始化数据
方法 doInBackground 主要执行后台的操作,与UI的交互,要交给回调函数
     onPostExecute 当执行完doback自动执行,参数为都
doInBackground的返回值 
     onPreExecute 进行doInBackground方法时,调用的方法 返回值为第三个
     onProgressUpdate 
执行过程中对外发布执行的的进度 返回值为第二个 
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public void ReadURL(String url) {
    /**
     * 当后台运行耗时操作时,主线程ui不受影响..和UI的互动中,要使用下面几个回调方法
     */
    new AsyncTask<String, Float, String>() {// 初始化数据 传递的数据类型 返回值数据类型
                                            // 返回结果的数据类型
 
        // 只能涉及和UI没关系的操作
        protected String doInBackground(String... argo) { // 执行后台的耗时操作
            try {
                URL url = new URL(argo[0]); // 从第一个数值读取
                URLConnection connection = url.openConnection();
 
                long total = connection.getContentLength();// 获取当前读取对象的全部长度
 
                InputStream iStream = connection.getInputStream();// 获得InputStream对象
                InputStreamReader isr = new InputStreamReader(iStream);// 创建InputStreamReader一层层包转起来
                BufferedReader br = new BufferedReader(isr);
 
                String line; // 存放的一行信息
                StringBuilder builder = new StringBuilder();// 存放连接的数据
                while ((line = br.readLine()) != null) {
                    builder.append(line);
 
                    publishProgress((float) builder.toString().length()
                            / total);// 获取过程中的百分比进度条
 
                }
                System.out.println(builder.toString());
                br.close();
                iStream.close();
                return builder.toString();
 
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        protected void onCancelled() {
            super.onCancelled();
        }
 
        protected void onCancelled(String result) {
            super.onCancelled(result);
        }
 
        /**
         * 当doInBackground方法结束后,自动调用该方法
         */
        protected void onPostExecute(String result) {// result就是doInBackground的返回值
            System.err.println(result);
            text.setText(result);
            super.onPostExecute(result);
        }
 
        /**
         * 进行doInBackground方法时,调用的方法
         */
 
        protected void onPreExecute() {
            Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_LONG)
                    .show();
            super.onPreExecute();
        }
 
        /**
         * 执行过程中对外发布执行的的进度
         */
        protected void onProgressUpdate(Float... values) {
            System.err.println(values[0]);
            super.onProgressUpdate(values);
        }
    }.execute(url);// 执行方法 传入的参数
}

转载于:https://my.oschina.net/TAOH/blog/526047

你可能感兴趣的文章
【IL】IL生成exe的方法
查看>>
论模式在领域驱动设计中的重要性
查看>>
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
linux命令:ls
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
灰度图像和彩色图像
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
将txt文件转化为json进行操作
查看>>
我的2014-相对奢侈的生活
查看>>
Java设计模式
查看>>
红黑树
查看>>
【数据库】
查看>>
WindowManager.LayoutParams 详解
查看>>
安卓中数据库的搭建与使用
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>