시간이 걸리는 작업을 할 때 AsyncTask를 사용한다. 작업을 하는 동안 사용자는 앱이 잘 작동하고 있는지 확인할 방법이 필요한데, 이 용도로 ProgressDialog를 자주 사용하게 된다.
ProgressDialog (진행 상황 바) 는 작업이 진행되고 있다는 것을 유저에게 나타낼 때 사용한다.
스피너 형태와 바 형태로 나뉜다.
|
스피너 형태 |
|
바 형태 |
기본값으로 스핀 형태로 설정. setProgressStyle(값) 메소드를 이용해서 형태를 바꿀 수 있음
ProgressDialog.STYLE_HORIZONTAL, ProgressDialog.STYLE_SPINNER 두 가지 상수로 바꿈.
Source Code
MyAsyncTask.java
package com.lety.myasynctaskdemo2;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
/** * Created by lety02 on 2017. 11. 27.. */
public class MyAsyncTask extends AsyncTask<Void, Integer, String>{
Context ctx;
ProgressDialog pd;
public MyAsyncTask(Context ct) {
ctx = ct;
}
@Override protected void onPreExecute() {
pd = new ProgressDialog(ctx);
pd.setTitle("Downloading");
pd.setMessage("Wait please...");
pd.setMax(10);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setButton(ProgressDialog.BUTTON_NEGATIVE, "취소", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
pd.show();
}
@Override
protected String doInBackground(Void... params) {
try {
for(int i = 0 ; i <= 10 ; i++)
{
Thread.sleep(500);
Log.i("Thread", "Execute " + i);
publishProgress(i);
}
return "Successful";
} catch (InterruptedException e) {
Log.i("Exception", e.getMessage());
return "Failure";
}
}
@Override
protected void onProgressUpdate(Integer... values) {
int myVal = values[0];
pd.setProgress(myVal);
}
@Override
protected void onPostExecute(String s) {
Toast.makeText(ctx, s, Toast.LENGTH_SHORT);
pd.dismiss();
}
}
MainActivity.java
package com.lety.myasynctaskdemo2;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doSomething(View view) {
MyAsyncTask p1 = new MyAsyncTask(this);
p1.execute();
}
}
=====================================
그 밖의 Memo들
Threading Performance
UI를 그리는 시간이 16ms를 넘기면 안된다.
( 왜 16ms 인가? => 초당 60프레임을 유지해야한다. 1000 / 16 )
안드로이드에서 제공하는 멀티스레딩 툴들
AsyncTask - helps get work on/off the UI thread
HandlerThread - Dedicated thread for API callbacks
ThreadPool - Running lots of parallel work
IntentService - Helps get intent off the UI thread
+ easy implementation
- leak memory
To “cancel” some work:
1. Check a “canceled” flag
2. Report
AsyncTask
매우 간단한 일에 사용해야 한다.
중첩해서 사용하면 안된다.
IntentService
+ 스레드를 알아서 시작하고 꺼준다.
Intent 번들을 이용해서 의사소통