zoukankan      html  css  js  c++  java
  • 吴裕雄--天生自然ANDROID开发学习:3.7 AsyncTask异步任务

    1)什么是多线程:
    答:先要了解这几个名称:应用程序,进程,线程,多线程!!
    
    应用程序(Application):为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)
    进程(Process) :运行中的程序,系统调度与资源分配的一个独立单位,操作系统会为每个进程分配 一段内存空间,程序的依次动态执行,经理代码加载 -> 执行 -> 执行完毕的完整过程!
    线程(Thread):比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个进程中才能执行! 线程是由程序负责管理的!!!而进程则是由系统进行调度的!!!
    多线程概念(Multithreading):并行地执行多条指令,将CPU的时间片按照调度算法,分配给各个线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉是同时而已!
    举个简单的例子: 你挂着QQ,突然想去听歌,你需要把QQ关掉,然后再去启动XX播放器吗?答案是否定的,我们直接打开播放器 放歌就好,QQ还在运行着,是吧!这就是简单的多线程~在实际开发中,也有这样的例子,比如应用正在运行, 发现新版本了,想后台更新,这个时候一般我们会开辟出一条后台线程,用于下载新版本的apk,但是这个时候 我们还可以使用应用中的其他功能!这就是多线程的使用例子
    
    Android 为什么要引入异步任务
    答:因为Android程序刚启动时,会同时启动一个对应的主线程(Main Thread),这个主线程主要负责处理 与UI相关的事件!有时我们也把他称作UI线程!而在Android App时我们必须遵守这个单线程模型的规则: Android UI操作并不是线程安全的并且这些操作都需要在UI线程中执行! 假如我们在非UI线程中,比如在主线程中new Thread()另外开辟一个线程,然后直接在里面修改UI控件的值; 此时会抛出下述异常: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 另外,还有一点,如果我们把耗时的操作都放在UI线程中的话,如果UI线程超过5s没有响应用于请求,那么 这个时候会引发ANR(Application Not Responding)异常,就是应用无响应~ 最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报: android.os.NetworkOnMainThreadException
    
    2)AsyncTask的基本结构:
    AsyncTask是一个抽象类,一般我们都会定义一个类继承AsyncTask然后重写相关方法
    
    官方API:AsyncTask:https://www.runoob.com/wp-content/uploads/2015/07/39584771.jpg
    

     

     

     

    布局文件:activity.xml:
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical"  
        tools:context=".MyActivity">  
        <TextView  
            android:id="@+id/txttitle"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content" />  
        <!--设置一个进度条,并且设置为水平方向-->  
        <ProgressBar  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:id="@+id/pgbar"  
            style="?android:attr/progressBarStyleHorizontal"/>  
        <Button  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:id="@+id/btnupdate"  
            android:text="更新progressBar"/>  
    </LinearLayout> 
    定义一个延时操作,用于模拟下载:
    
    public class DelayOperator {  
        //延时操作,用来模拟下载  
        public void delay()  
        {  
            try {  
                Thread.sleep(1000);  
            }catch (InterruptedException e){  
                e.printStackTrace();;  
            }  
        }  
    }
    自定义AsyncTask:
    
    public class MyAsyncTask extends AsyncTask<Integer,Integer,String>  
    {  
        private TextView txt;  
        private ProgressBar pgbar;  
      
        public MyAsyncTask(TextView txt,ProgressBar pgbar)  
        {  
            super();  
            this.txt = txt;  
            this.pgbar = pgbar;  
        }  
      
      
        //该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法  
        //触发onProgressUpdate对UI进行操作  
        @Override  
        protected String doInBackground(Integer... params) {  
            DelayOperator dop = new DelayOperator();  
            int i = 0;  
            for (i = 10;i <= 100;i+=10)  
            {  
                dop.delay();  
                publishProgress(i);  
            }  
            return  i + params[0].intValue() + "";  
        }  
      
        //该方法运行在UI线程中,可对UI控件进行设置  
        @Override  
        protected void onPreExecute() {  
            txt.setText("开始执行异步线程~");  
        }  
      
      
        //在doBackground方法中,每次调用publishProgress方法都会触发该方法  
        //运行在UI线程中,可对UI控件进行操作  
      
      
        @Override  
        protected void onProgressUpdate(Integer... values) {  
            int value = values[0];  
            pgbar.setProgress(value);  
        }  
    }
    MainActivity.java:
    
    public class MyActivity extends ActionBarActivity {  
      
        private TextView txttitle;  
        private ProgressBar pgbar;  
        private Button btnupdate;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            txttitle = (TextView)findViewById(R.id.txttitle);  
            pgbar = (ProgressBar)findViewById(R.id.pgbar);  
            btnupdate = (Button)findViewById(R.id.btnupdate);  
            btnupdate.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);  
                    myTask.execute(1000);  
                }  
            });  
        }  
    } 
    
  • 相关阅读:
    UVA 12338
    最短路问题
    菜鸟调错(十)——启动Tomcat报错“Unsupported major.minor version xxx ”
    Servlet总结(一)
    <html>
    Android Developer:Allocation Tracker演示
    H2数据库集群
    安卓通过广播自己主动回填短信验证码
    江湖问题研究-- intent传递有没有限制大小,是多少?
    spring 配置文件被加载两次
  • 原文地址:https://www.cnblogs.com/tszr/p/13582921.html
Copyright © 2011-2022 走看看