android-asynctaskandroid-asynctask 시작하기


비고

이 섹션에서는 android-asynctask가 무엇인지, 왜 개발자가 그것을 사용하고 싶어하는지에 대한 개요를 제공합니다.

또한 android-asynctask 내의 큰 주제를 언급하고 관련 주제에 링크해야합니다. android-asynctask에 대한 문서가 새롭기 때문에 그러한 관련 주제의 초기 버전을 만들어야 할 수도 있습니다.

개념에서 구현에 이르기까지 AsyncTask

개념

AsyncTask는 백그라운드에서 작업을 실행하고 결과를 UI 스레드에 게시 할 수있는 클래스입니다. 주요 목적은 핸들러와 스레드 조작에 필요한 모든 것을 제거하여 스레드를 시작 / 실행하기위한 모든 상용구 코드를 제거하는 것입니다. 또한 AsyncTask의 목적은 오랜 시간이 아닌 백그라운드 스레드에서 (단 몇 초 만에) 단시간 작업을 수행하는 것입니다. 따라서 AsyncTask를 일반적인 스레딩 프레임 워크와 혼동하지 않는 것이 중요합니다. 오랜 시간 동안 작업해야하는 경우 동시 패키지가 권장됩니다.

일반적인 고려 사항

AsyncTask는 Params, Progress 및 Results라는 세 가지 유형으로 정의됩니다. 실행 된 순간부터 4 단계 (메소드)를 거칩니다. 첫 번째는 onPreExecute입니다 . 누군가가 로딩 대화 상자를 정의하거나 실행을 시작하려고하는 사용자에게 알릴 수있는 UI 메시지를 정의 할 수 있습니다. 다음으로, doInBackground 는 Ui 스레드와 다른 스레드에서 비동기 적으로 실행되는 메소드입니다. 세 번째 방법은 사용자에게 상태를 알릴 수있는 UI 스레드에서 실행할 수있는 onProgressUpdate 입니다. 마지막으로 호출되는 메서드는 onPostExecute 이며 주로 결과를 게시하는 데 사용됩니다.

다음은 AsyncTask를 사용하여 문자열을 반환하는 방법에 대한 예입니다.
예제 1

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (FloatingActionButton) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                executeAsyncTaskOperation();
            }
        });
    }


      private void executeAsyncTaskOperation() {
        new CustomAsyncTask(this).execute();
    }

    private static class CustomAsyncTask extends AsyncTask<Void, Void, String> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected String doInBackground(Void... params) {
            String object = null;
            try {
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                Thread.sleep(500);
                //bject = "new object";
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                object = null;
            }
            return object;
        }

        @Override
        protected void onPostExecute(String s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null) {
                Toast.makeText(context, "finished successfully!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}
 

예제 2

여기에서 AsyncTask는 약간 다르며 execute 메서드는 백그라운드에서 분석 할 데이터 목록을받습니다. 반환 결과는이 수표에 따라 다릅니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

                executeAsyncTaskOperation();
            }
        });
    }


    private void executeAsyncTaskOperation() {
        Boolean[] bools = new Boolean[10];
        for (int k = 0; k < 10; k++) {
            if (k % 2 == 0) {
                bools[k] = true;
            } else {
                bools[k] = false;
            }
        }
        new CustomAsyncTask(this).execute(bools);
    }

    private static class CustomAsyncTask extends AsyncTask<Boolean, Void, Integer> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected Integer doInBackground(Boolean... params) {
            int count = 0;
            try {
                Thread.sleep(1000);
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                for (Boolean param : params) {
                    if (param) {
                        count++;
                    }
                }
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                count = 0;
            }
            return count;
        }

        @Override
        protected void onPostExecute(Integer s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null && s > 0) {
                Toast.makeText(context, "finished loading: " + s + " tasks", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}