Android AsyncTask는 백그라운드 스레드에서 백그라운드 작업을 수행하고 메인 스레드에서 업데이트합니다. 안드로이드에서 우리는 안드로이드 개발에서 배경 스레드를 메인 스레드에 직접 건드릴 수 없습니다. asynctask는 백그라운드 스레드와 메인 스레드 간의 통신을 도와줍니다.
AsyncTask의 메소드
-
onPreExecute() − 백그라운드 작업을 수행하기 전에 진행률 표시줄이나 애니메이션과 같은 것을 사용자에게 화면에 표시해야 합니다. doInBackground()를 사용하여 백그라운드 작업을 직접 종료할 수 있지만 모범 사례를 위해 모든 asyncTask 메서드를 호출해야 합니다.
-
doInBackground(매개변수) − 이 방법에서는 백그라운드 스레드에서 백그라운드 작업을 수행해야 합니다. 이 방법의 작업은 메인 스레드 활동이나 단편을 건드리면 안 됩니다.
-
onProgressUpdate(진행…) − 백그라운드 작업을 수행하는 동안 UI에 대한 일부 정보를 업데이트하려면 이 방법을 사용할 수 있습니다.
-
onPostExecute(결과) − 이 방법으로 백그라운드 작업 결과의 UI를 업데이트할 수 있습니다.
비동기 작업의 일반 유형
-
TypeOfVarArgParams − 실행에 사용된 매개변수의 유형에 대한 정보가 포함되어 있습니다.
-
진행 가치 − 진행 단위에 대한 정보가 포함되어 있습니다. 백그라운드 작업을 수행하는 동안 onProgressUpdate()를 사용하여 UI에 대한 정보를 업데이트할 수 있습니다.
-
결과값 −결과 유형에 대한 정보가 포함되어 있습니다.
이 예제는 Android에서 asyncTask를 사용하는 방법을 보여줍니다.
1단계 − Android Studio에서 새 프로젝트를 생성하고 파일 ⇒ 새 프로젝트로 이동하여 필요한 모든 세부 정보를 입력하여 새 프로젝트를 생성합니다.
2단계 − res/layout/activity_main.xml에 다음 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:id = "@+id/rootview" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" android:background = "#c1c1c1" android:gravity = "center_horizontal" tools:context = ".MainActivity"> <Button android:id = "@+id/asyncTask" android:text = "Download" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <ImageView android:id = "@+id/image" android:layout_width = "300dp" android:layout_height = "300dp" /> </LinearLayout>
위의 xml에서 버튼을 만들었습니다. 사용자가 버튼을 클릭하면 이미지를 다운로드하고 imageview에 이미지를 추가합니다.
3단계 − src/MainActivity.java
에 다음 코드 추가package com.example.andy.myapplication; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity { URL ImageUrl = null; InputStream is = null; Bitmap bmImg = null; ImageView imageView= null; ProgressDialog p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=findViewById(R.id.asyncTask); imageView=findViewById(R.id.image); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AsyncTaskExample asyncTask=new AsyncTaskExample(); asyncTask.execute("https://www.tutorialspoint.com/images/tp-logo-diamond.png"); } }); } private class AsyncTaskExample extends AsyncTask<String, String, Bitmap> { @Override protected void onPreExecute() { super.onPreExecute(); p = new ProgressDialog(MainActivity.this); p.setMessage("Please wait...It is downloading"); p.setIndeterminate(false); p.setCancelable(false); p.show(); } @Override protected Bitmap doInBackground(String... strings) { try { ImageUrl = new URL(strings[0]); HttpURLConnection conn = (HttpURLConnection) ImageUrl.openConnection(); conn.setDoInput(true); conn.connect(); is = conn.getInputStream(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; bmImg = BitmapFactory.decodeStream(is, null, options); } catch (IOException e) { e.printStackTrace(); } return bmImg; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if(imageView!=null) { p.hide(); imageView.setImageBitmap(bitmap); }else { p.show(); } } } }
위의 코드에서는 asyncTask를 사용하여 이미지를 다운로드하고 imageview에 이미지를 추가합니다.
4단계 − manifest.xml에 다음 코드 추가
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns:android = "https://schemas.android.com/apk/res/android" package = "com.example.andy.myapplication"> <uses-permission android:name = "android.permission.INTERNET"/> <application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:roundIcon = "@mipmap/ic_launcher_round" android:supportsRtl = "true" android:theme = "@style/AppTheme"> <activity android:name = ".MainActivity"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
위의 AndroidManifest.xml 파일에서 이미지를 다운로드하기 위해 인터넷에 액세스할 수 있는 인터넷 권한을 추가했습니다.
응용 프로그램을 실행해 보겠습니다. 실제 Android 모바일 장치를 컴퓨터에 연결했다고 가정합니다. android studio에서 앱을 실행하려면 프로젝트의 활동 파일 중 하나를 열고 도구 모음에서 Run Eclipse Run Icon 아이콘을 클릭합니다. 모바일 장치를 옵션으로 선택한 다음 기본 화면을 표시할 모바일 장치를 확인하십시오.
이제 다운로드 버튼을 클릭하면 아래와 같이 UI에 진행 상황이 표시되고 배경에 다운로드 이미지가 표시됩니다.
이미지를 다운로드하면 아래와 같이 UI에 업데이트됩니다.