This question already has an answer here:
Using AsyncTask

(1个答案)


已关闭6年。




我想在我的应用程序中使用AsyncTask,但是在查找代码片段时遇到了麻烦,该代码片段仅提供了有关工作原理的简单说明。我只希望有一些东西可以帮助我快速恢复速度,而不必再次经历the documentation或很多问答。

最佳答案

AsyncTask是在Android中实现并行性的最简单方法之一,而无需处理诸如Threads之类的更复杂的方法。尽管它提供了与UI线程的基本并行度,但不应将其用于更长的操作(例如,不超过2秒)。

AsyncTask有四种方法

  • onPreExecute()
  • doInBackground()
  • onProgressUpdate()
  • onPostExecute()
  • doInBackground()最重要,因为它是执行后台计算的地方。

    代码:

    这是带有说明的骨骼代码概述:
    public class AsyncTaskTestActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // This starts the AsyncTask
            // Doesn't need to be in onCreate()
            new MyTask().execute("my string parameter");
        }
    
        // Here is the AsyncTask class:
        //
        // AsyncTask<Params, Progress, Result>.
        //    Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
        //    Progress – the type that gets passed to onProgressUpdate()
        //    Result – the type returns from doInBackground()
        // Any of them can be String, Integer, Void, etc.
    
        private class MyTask extends AsyncTask<String, Integer, String> {
    
            // Runs in UI before background thread is called
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
                // Do something like display a progress bar
            }
    
            // This is run in a background thread
            @Override
            protected String doInBackground(String... params) {
                // get the string from params, which is an array
                String myString = params[0];
    
                // Do something that takes a long time, for example:
                for (int i = 0; i <= 100; i++) {
    
                    // Do things
    
                    // Call this to update your progress
                    publishProgress(i);
                }
    
                return "this string is passed to onPostExecute";
            }
    
            // This is called from background thread but runs in UI
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
    
                // Do things like update the progress bar
            }
    
            // This runs in UI when background thread finishes
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
    
                // Do things like hide the progress bar or change a TextView
            }
        }
    }
    

    流程图:

    这是一个图表,以帮助解释所有参数和类型的去向:

    android - Android AsyncTask示例和解释-LMLPHP

    其他有用的链接:
  • What arguments are passed into AsyncTask<arg1, arg2, arg3>?
  • Slidenerd Android AsyncTask Tutorial: Android Tutorial For Beginners
  • Understanding AsyncTask – Once and Forever
  • Dealing with AsyncTask and Screen Orientation
  • How to pass multiple parameters to AsynkTask
  • how to pass in two different data types to AsyncTask, Android
  • 关于android - Android AsyncTask示例和解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25647881/

    10-13 06:15