Android Thread和AsyncTask

1. 线程Thread

2. 异步任务AsyncTask

-------------------------------------------------

-------------------------------------------------

1. 线程Thread

在APK开启后,就会有一个主线程,负责与用户交互。如果在主线程中执行了耗时操作,那么界面就会停止响应,所以要将耗时操作转移到别的线程中

2. 异步任务AsyncTask

耗时任务不能再UI主线程中执行,异步任务使用AsyncTask

AsyncTask<String, Float, String>
       //第一个参数String代表传入参数
      //第二个参数Float代表 执行过程中的数值
      //第三个参数String 代表返回值

下面是一个读取网页操作的demo

① 布局文件: 点击button,将获取到的内容放在TextView中显示

<Button
    android:id="@+id/btnRead"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/read_website" />

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</ScrollView>

② 定义AsyncTask

在 doInBackground 中不能调用UI控件进行操作

对UI控件的操作必须在其他几个回调函数中执行:onCancelled,onCancelled(),onPostExecute, onPreExecute, onProgressUpdate

public void readUrl(String url) {
    new AsyncTask<String, Float, String>() {
        //第一个参数String代表传入参数
        //第二个参数Float代表 执行过程中的数值
        //第三个参数String 代表返回值
        @Override
        protected String doInBackground(String... params) {
            // 在后台运行
            try {
                URL url = new URL(params[0]);
                URLConnection conn = url.openConnection();
                long total = conn.getContentLength(); // 要读取的内容总长度
                InputStream is = conn.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);

                String line;
                StringBuilder builder = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    builder.append(line);
                    float values = builder.toString().length() / total;
                    publishProgress(values); // 对应onProgressUpdate, 对外发布进度
                }
                br.close();
                isr.close();
                is.close();
                return builder.toString(); //对应onPostExecute
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            // TODO Auto-generated method stub
            super.onCancelled();
        }

        @Override
        protected void onCancelled(String result) {
            // TODO Auto-generated method stub
            super.onCancelled(result);
        }

        @Override
        protected void onPostExecute(String result) {
            // 当前的Async执行完毕后会回调它
            tv1.setText(result);
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            // 当前的Async执行完毕前会回调它
            Toast.makeText(getApplicationContext(), "start Read",
                    Toast.LENGTH_SHORT).show();
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Float... values) {
            // 在执行任务的过程中对外发布执行的进度
            Log.d("CARLOZ", "values = " + values[0]);
            super.onProgressUpdate(values);
        }

    }.execute(url);
}

③ 调用AsyncTask

TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1 = (TextView) findViewById(R.id.textView1);
    findViewById(R.id.btnRead).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            readUrl("http://carloz.duapp.com");
        }
    });
}

结果如下:

时间: 2024-11-11 06:03:27

Android Thread和AsyncTask的相关文章

Android Thread和AsyncTask的区别和联系

一.Thread简介 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行.默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程.当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的.当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程. 在And

Android笔记二十六.Android异步任务处理(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Te

android异步类AsyncTask的简单使用

Android为了降低这个开发难度,提供了AsyncTask.AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务,更通俗地说就是一个执行后台任务的线程 而且他还会自动通知主线程更新UI 优点: 结构清晰,容易理解. 缺点 代码量稍大 下面直接看代码 1 private class AsyncLogin extends AsyncTask<Void,Integer,Boolean>{ 2 private EditText passwordEdit; 3 private EditT

Android 中的AsyncTask

在后台下载图片,下载完成后更新UI是一个很常见的需求.在没有AsyncTask类之前,我们需要写许多thread和Handler的代码去实现这个功能,有了AsyncTask,一切变得简单了.下面摘抄谷歌官方介绍: AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should i

Android备注26.Android异步任务(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕画图事件等,对于其它的操作尽量不要在UI线程中实现,由于这些操作非常有可能会堵塞UI线程,比方一些耗时操作,会导致UI界面停止响应,从而减少了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完毕.但新线程也可能须要动态更新UI组件:比方须要从网上获取一个网页,然后在T

android线程(二)AsyncTask(一)

转载请注明出处:http://blog.csdn.net/itachi85/article/details/45041923 AsyncTask的基本用法这里就不在赘述了,是个安卓开发者就会. 1.android 3.0以前的 AsyncTask private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final it KEEP_AL

android异步请求asyncTask使用—分析getResponseCode()阻塞

在实际应用中经常会遇到比较耗时任务的处理,比如网络连接,数据库操作等情况时,如果这些操作都是放在主线程(UI线程)中,则会造成UI的假死现象,Android中可以使用AsyncTask和Handler两种异步方式来解决这种问题. AsyncTask(异步任务处理) 在使用AsyncTask时处理类需要继承AsyncTask,提供三个泛型参数,并且重载AsyncTask的四个方法(至少重载一个). An asynchronous task is defined by a computation t

Android异步任务AsyncTask的使用与原理分析

在上一篇文章<Android缓存机制&一个缓存框架推荐>中说到,在了解了Android缓存机制后我准备自己动手写一个LruCache和DiskLruCache二级缓存的轻量级的图片请求框架,在思考如何搭建这个框架时,纠结于用何种方式去下载图片,是直接new出一个线程呢,还是用看起来稍微高大上档次一点的AsyncTask异步任务来处理?思来想去,还是虚荣心作怪,还是用AsyncTask吧,正好这个工具类我之前用的也比较少,对它的原理也不是很清楚,趁这个机会,好好学一下AsyncTask的

android 异步任务AsyncTask

package com.example.ansyctest; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl