zoukankan      html  css  js  c++  java
  • 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");
            }
        });
    }

     结果如下:

  • 相关阅读:
    [crontab]修改默认编辑器
    [mysql]忘记用户密码或者误删用户账号
    [vim]多行注释和多行删除
    [mysql]my.cnf在哪里
    [python]有中文字符程序异常的解决方案
    [Linux]虚拟机无法安装deepin15.9的解决方案
    Elasticsearch5.X IN Windows 10 系列文章(2)
    Elasticsearch5.X IN Windows 10 系列文章(1)
    HTTP Error 502.5
    centos7 yum install redis
  • 原文地址:https://www.cnblogs.com/carlo/p/4757074.html
Copyright © 2011-2022 走看看