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控件的操作必须在其他几个回调函数中执行:onCancelledonCancelled()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");
        }
    });
}

 结果如下:

posted @ 2015-08-25 12:07  carlo-z  阅读(440)  评论(0编辑  收藏  举报