zoukankan      html  css  js  c++  java
  • AndroidAsyncTask

    AsyncTask能够适当地、简单地用于 UI线程。这个类准许执行后台操作,让那些没有熟练操作线程的操作者在 UI线程上发布结果。

    异步任务的定义是一个在后台线程上运行,其结果是在 UI线程上发表的计算。

    异步任务被定义成三种一般类型: Params Progress Result;四步: begin ,doInBackground , processProgress 和end.

    用法:

    AysncTask必须被继承成子集应用。子类至少 override一个方法 (doInBackground(Params...)),最多经常 override另一个(onPostExecute(Result))

    子类例子:

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {     
                       protected Long doInBackground(URL... urls) {         
                                 int count = urls.length;         
                                 long totalSize = 0;         
                                 for (int i = 0; i < count; i++) {             
                                           totalSize += Downloader.downloadFile(urls[i]);             
                                           publishProgress((int) ((i / (float) count) * 100));         
                                 }         
                                 return totalSize;     
                       }      
    
                       protected void onProgressUpdate(Integer... progress) {         
                                 setProgressPercent(progress[0]);     
                       }      
    
                       protected void onPostExecute(Long result) {         
                                 showDialog("Downloaded " + result + " bytes");     
                       } 
    }
    
    一旦创建,一个任务执行起来就非常简单:

    new DownloadFilesTask().execute(url1, url2, url3);

    AsyncTask 的一般类型 :

     

     

    这三个类型被用于一个异步任务,如下:

    1.Params,当执行时,参数类型发送到任务

    2.Progress,在后台计算期间,线程单位类型被发布

    3.Result,后台计算的结果类型

    在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地适用 Void类型:

    [code]private class MyTask extends AsyncTask[/code]

    四步曲:

     

     

     

    当一个异步任务被执行,这个任务要完成四步:

    1.onPreExecute(),任务被执行之后,立刻调用 UI线程。这步通常被用于设置任务,例如在用户界面显示一个进度条。

    2.doInBackground(Params...), onPreExecute()完成执行,立刻调用后台线程,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。

    3.onProgressUpdate(Progress...),一次呼叫 publishProgress(Progress...)后调用 UI线程,执行的时机没有定义。这个方法用于在用户界面显示进度,当后台计算还在进行时。例如:这个方法可以被用于一个进度条动画或在文本域显示日志。

    4.onPostExecute(Result), 当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。

    线程规则:

     

    有一些线程规则必须去遵守,这个类才会正确的工作:

    *任务实例必须创建在 UI线程

    * execute(Params...)必须在 UI线程上调用

    *不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)

    *任务会执行仅一次(假如有第二个尝试去执行,将抛出一个异常)

    public class Double extends Activity {
    
        public ProgressBar pBar;
    
        /** Called when the activity is first created. */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            pBar = (ProgressBar) findViewById(R.id.progress_bar);
            //线程规则二:execute(Params...)必须在UI线程上调用
            new AsyncLoader().execute((Void)null);
        }
    
        public void initProgress() {
            pBar.setProgress(0);
            //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
            for (int i = 0; i < 100; i++) {
                System.out.println("***********" + i + "*************");
            }
            pBar.setProgress(30);
            //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
            for (int i = 0; i < 100; i++) {
                System.out.println("***********" + i + "*************");
            }
            pBar.setProgress(60);
            //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
            for (int i = 0; i < 100; i++) {
                System.out.println("***********" + i + "*************");
            }
            pBar.setProgress(100);
            Intent intent = new Intent(Double.this, Double2.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            finish();
        }
        
        //继承于AsyncTask
        class AsyncLoader extends AsyncTask<Void, Void, Integer>{
    
            @Override
            protected Integer doInBackground(Void... params) {
                initProgress();
                return null;
            }
            
        }
    }
    

    ddd

  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/jqyp/p/1852464.html
Copyright © 2011-2022 走看看