ide/androidstudio

ADT 스레드, AsyncTask

C/H 2016. 1. 6. 08:30

표준자바 스레드(안드로이드 가능)

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