android 전달 - 안드로이드 AsyncTask 예제 및 설명




재사용 호출 (2)

이 질문에는 이미 답변이 있습니다.

내 응용 프로그램에서 AsyncTask 를 사용하고 싶지만 어떻게 작동하는지 간단한 설명과 함께 코드 스 니펫을 찾는 데 문제가 있습니다. 나는 단지 documentation 또는 많은 Q & A를 통해 걸어 가야 할 필요없이 신속하게 속도를 높일 수있는 방법을 원합니다.


Answers

AsyncTask 는 Threads와 같은보다 복잡한 메소드를 다루지 않고도 Android에서 병렬 처리를 구현하는 가장 쉬운 방법 중 하나입니다. 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
        }
    }
}

플로우 다이어그램 :

다음은 모든 매개 변수와 유형의 위치를 ​​설명하는 다이어그램입니다.

기타 유용한 링크 :


API 21 (첫 번째 Android 5.0 / Lollipop SDK) 에서 Goat Simulator 앱이 설치되어 있는지 여부를 감지합니다.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

이것은 djechlin 이 경고없이 경고 if (false) 로 사용하는 것이 잠재적으로 비참한 전략임을 분명히해야합니다. 이전에 모든 장치에 대해 false 를 반환 한 것은 이제 무작위로 보이는 값을 반환합니다. 코드에서 충분히 깊숙이 묻혀 있으면 새로운 버그가 어디에서 왔는지 파악하는 시간이 오래 걸릴 수 있습니다.

결론 : 메소드의 구현을 제어하지 않고 API 문서에 명시된 용도 이외의 용도로 사용하기로 결정했다면 문제가 될 수 있습니다.





android android-asynctask