• Android AsyncTask简单讲解用法


    看代码吧!注释。。。

    package com.example.asynctask;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
        
        private TextView t1 ; // AsyncTask启动时 标识
        private TextView t2 ; // AsyncTask运行时 标识
        private TextView t3 ; // AsyncTask运行完时 标识
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            t1 = (TextView) findViewById(R.id.textView1) ;
            t2 = (TextView) findViewById(R.id.textView2) ;
            t3 = (TextView) findViewById(R.id.textView3) ;
            
            Button btn = (Button) findViewById(R.id.button1) ;
            btn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    // 点击按钮启动线程,
                    // execute传入的参数是泛型的第一个类型值,可多个
                    DemoAsyncTask task = new DemoAsyncTask() ;
                    task.execute("张小娴") ;
                }
            }) ;
            
        }
        
        // 第一个泛型 启动线程时传入的参数类型
        // 第二个泛型 线程运行时线程运行状态的标识参数类型
        // 第三个泛型 线程运行结束时标识的参数类型
        private class DemoAsyncTask extends AsyncTask<String, String, Long> {
    
            // 线程的运行主体部分,相当于继承Thread中的run方法
            @Override
            protected Long doInBackground(String... params) {
                // TODO Auto-generated method stub
                
                if(params[0].equals("张小娴")) {
                    for (long i = 0; i < 20000; i++) {
                // 调用这个方法更新界面 publishProgress(String.valueOf(i)) ; } }
    return (long) 3210; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } // 线程启动时最先执行的方法,该方法可以做一些线程运行的准备工作 @Override protected void onPreExecute() { t1.setText("启动了") ; } // 线程运行时,更新界面的一个方法,例如进度条之类的 // 这里不断更新textview中的数字,数字的值是doInBackground方法中的for内部的i值 // 具体看doInBackground方法 @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub t2.setText(values[0]) ; } // 线程执行完成后所做的工作,这里做的是t3 settext为3210, // 这个3210是由doInBackground方法返回的值 // 一般在这个方法中做一些更新界面的操作 @Override protected void onPostExecute(Long result) { t3.setText(String.valueOf(result)) ; // t3.setText("完成") ; } } }

    要运行起来,只需要在布局文件中添加几个textview和一个button即可。

    需要注意的是,AsyncTask只能被主线程启动,不能被子线程启动。

    需要被子线程启动的线程,可以直接继承Thread实现,或者实现Runnable接口。

  • 相关阅读:
    Codeforces Gym 100015F Fighting for Triangles 状压DP
    Codeforces Gym 100015B Ball Painting 找规律
    Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
    Codeforces Gym 100231G Voracious Steve 记忆化搜索
    Codeforces Gym 100231F Solitaire 折半搜索
    Codeforces Gym 100231L Intervals 数位DP
    Codeforces Gym 100231B Intervals 线段树+二分+贪心
    Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
    Codeforces Round #339 (Div. 2) B. Gena's Code 水题
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
  • 原文地址:https://www.cnblogs.com/jinglingJuly/p/3077033.html
Copyright © 2020-2023  润新知