- Do it! 안드로이드[개정 2판 롤리팝] Day23 01 - 안드로이드 스레드
- Do it! 안드로이드[개정 2판 롤리팝] Day24 01 - 일정시간 후에 실행하기
- Do it! 안드로이드[개정 2판 롤리팝] Day25 01 - AsyncTask 사용하기
표준자바 스레드(안드로이드 가능)
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); RequestThread thread = new ReqeustThread(); thread.start(); // run() 실행 } class RequestThread extends Thread { public void run() { for(int i = 0; i <100; ㅑ++){ println("#", + i + " :호출"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } public void pringln(String data){ Log.d(TAG, data); } } }
스레드에서 메인UI접근
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; TextView textView; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); } public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); textView.setText("스레드 시작"); RequestThread thread = new ReqeustThread(); thread.start(); // run() 실행 } class RequestThread extends Thread { public void run() { for(int i = 0; i <100; ㅑ++){ println("#", + i + " :호출"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } public void pringln(String data){ Log.d(TAG, data); //textView.setText("스레드 시작"); // 데드락으로 앱이 비정상 종료됨 } } }
handler 로 메인 UI 접근
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; TextView textView; ResponseHandler handler = new ResponseHandler(); @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); } public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); textView.setText("스레드 시작"); RequestThread thread = new ReqeustThread(); thread.start(); // run() 실행 } class RequestThread extends Thread { public void run() { for(int i = 0; i <100; ㅑ++){ println("#", + i + " :호출"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } public void pringln(String data){ Log.d(TAG, data) Message message = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("data", data); message.setData(bundle); handler.sendMessage(message); } } class ReponseHendler extends Handler { @Override public void handlerMessage(Message msg){ //super.handlerMessage(msg); Bundle bundle = msg.getDdata(); String data = bundle.getString("data"); textView.setText(data); } } }
handler Runalbe 사용
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; TextView textView; Handler handler = new Handler(); // 기본핸들러 객체를 제공한다. @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); } public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); textView.setText("스레드 시작"); RequestThread thread = new ReqeustThread(); thread.start(); // run() 실행 } class RequestThread extends Thread { public void run() { for(int i = 0; i <100; ㅑ++){ println("#", + i + " :호출"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } public void pringln(final String data){ Log.d(TAG, data); handler.post(new Runalbe(){ // Handler는 메인스레드이기 때문에 run은 메인스레드에서 동작한다. public void run(){ textView.setText(data); } }); } } }
일정시간 이후 실행하기
public class MainActivity extends AppCompatActivity { class RequestThread extends Thread { public void run() { for(int i = 0; i <100; ㅑ++){ println("#", + i + " :호출"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } public void pringln(final String data){ Log.d(TAG, data); handler.postDelayed(new Runalbe(){ // Handler는 메인스레드이기 때문에 run은 메인스레드에서 동작한다. public void run(){ textView.setText(data); } }, 1000); // 1초뒤에 실행 } } }
스레드로 메세지 전송
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; TextView textView; ProcessThread thread; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); thread = new ProcessThread(); thread.start(); } public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); thread.processHandler.post(new Runable(){ // ProcessThread 안에서 동작한다. public void run(){ Log.d(TAG, '메인 스레드에서 새로운 스레드로 전단"); } }); } class ProcessThread extends Thread { public ProcessThread(){ } public void run() { Looper.prepare(); Looper.Loop(); for(int i = 0; i <100; ㅑ++){ println("#", + i + " : 스레드 동작"); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } } }
aSyncTask
-
doInBackground
- 새로 만든 스레드에서 백그라운드 작업 수행
- execute() 메소드를 호출할 때 사용된 파라미터를 배열로 전달받음. -
onPreExcute
- 백그라운드 작업 수행 전 호출
- 메인 스레드에서 실행되며 초기화 작업에 사용 -
onProgressUpdate
- 백그라운드 작업 진행 상태를 표시하기 위해 호출
- 작업 수행 중간 중간에 UI객체에 접근하는 경우 사용
- 이 메소드가 호출되도록 하려면 백그라운드 작업 중간에 publishProgress()메소드를 호출 -
onPostExecute
- 백그라운드 작업이 끈난 후 호출 - 메인 스레드에서 실행되면 메모리 리소스를 해제한느 등의 작업에 사용 - 백그라운드 작업의 결과는 Result 타입의 파라미터로 전달
- AsyncTask 객체 : execute4() 시작, cancel() 취소 (onCancelled() 메소드 호출)
- AsyncTask 객체 : getStatus() 작업 진행상황 확인, PENDING(시작전), RUNNING(실행중), FINISHED(종료) 구분
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; TextView textView; ProgressBar progressBar; int value = 0; BackgroundTask tqsk; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); progressBar = (TrogressBar) findViewById(R.id.progressBar); } // 시작 public void onButton1Clicked(View v){ Log.d(TAG, 'onButton1Clicked)'); BackgroundTask task = new BackgroundTask(); task.execute(100); } // 취소 public void onButton2Clicked(View v){ Log.d(TAG, 'onButton2Clicked)'); task.cancel(true); } class BackgroundTask extends AsyncTask<integer, integer, integer> { @Override protected void onPreExecute(){ //super.onPreExecute(); value = 0; progressBar.setProgress(valud); } @Override protected void onPostExecute(Integer ingeger){ //super.onPostExecute(); value = 0; progressBar.setProgress(valud); textView.setTExt("중지됨"); } @Override protected void onProgressUpdate(Integer... values){ //super.onProgressUpdate(values); progressBar.setProgress(values[0].intValud()); textView.setText("진행중" + values[0] ); } @Override protected Integer doInBackground(Integer.. params){ //return nulll; while( ! isCanceled() ){ value++; if( value >= 100 ){ break; } else { publishProgress(value); } try{ Thread.sleep(200); }catch(Exception e){} return value; } } } }
반응형
'ide > androidstudio' 카테고리의 다른 글
webview (0) | 2016.11.05 |
---|---|
Android Bluetooth (0) | 2016.01.20 |
studio.vmoptions (0) | 2015.12.15 |
Android Studio Latest Javac (0) | 2015.12.03 |
“Couldn't resolve resource” in Android Studio's Preview (0) | 2015.11.18 |