1. 안드로이드 파일 복사 (IO복사 & 쓰레드 필요성), (버튼을 누르면 파일을 복사)
2. 파일 복사를 쓰레드로 (쓰레드 복습) + 프로그레스 UI처리(쓰레드간 통신)
3. TCP/UDP 통신
4. HTTP 통신
5. HTTP 통신을 통해 받은 데이터들을 ListView등에 적절히 표현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private static final String SDCARD_PATH = Environment.getExternalStorageDirectory().toString(); private static final String ORIGIN_FILE = SDCARD_PATH + File.separator+ "1.jpg"; private static final String DEST_FILE = SDCARD_PATH + File.separator+ "2.jpg"; private Button copyBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); copyBtn = (Button) findViewById(R.id.main_copy_btn); copyBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub FileInputStream fi = null; FileOutputStream fo = null; byte[] buf = null; try{ fi = new FileInputStream(ORIGIN_FILE); fo = new FileOutputStream(DEST_FILE); buf = new byte[1024]; int length; while((length = fi.read(buf)) > 0) { fo.write(buf, 0, length); //파일 전부를 옮길때까지 이걸 반복 } fo.flush(); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } }); } } | cs |
1 2 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | cs |
버튼 클릭 이벤트가 작업이 너무 오래 걸릴시 UI가 먹통이 됨
-> 쓰레드 사용
Thread사용방법
Thread를 상속 받아서 동작하고자 하는 작업을 run함수를 재정의해서 작성하고, start 함수를 호출하면 파생이 run 실행
Runnable인터페이스를 구현한 클래스를 작성하고 그 클래스의 객체를 Thread생성자에 넣어주면 start부르면 Runnable구현체가 갖고 있는 run을 실행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Thread t = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub FileInputStream fi = null; FileOutputStream fo = null; byte[] buf = null; try{ fi = new FileInputStream(ORIGIN_FILE); fo = new FileOutputStream(DEST_FILE); buf = new byte[1024]; int length; while((length = fi.read(buf)) > 0) { fo.write(buf, 0, length); //파일 전부를 옮길때까지 이걸 반복 } fo.flush(); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } }); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class MyAsyncTask extends AsyncTask<Void, Integer, Void> { ProgressDialog dialog; @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub // 파생쓰레드로 처리할 작업 return null; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); //초기에 수행할 메소드 } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); // 다 끝나고 수행 할 메소드 } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); // doInBackground에서 호출 가능한 UI작업 처리 메소드 } } | cs |
1 2 3 4 5 6 7 8 9 10 | protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); //초기에 수행할 메소드 dialog = new ProgressDialog(MainActivity.this); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgress(0); dialog.setMax(100); dialog.setCancelable(false); dialog.show(); } | cs |
1 2 3 4 5 | protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); // 다 끝나고 수행 할 메소드 dialog.dismiss(); } | cs |
1 2 3 4 5 | protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); // doInBackground에서 호출 가능한 UI작업 처리 메소드 dialog.incrementProgressBy(1); // 1만큼 프로그레스를 늘림 } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub // 파생쓰레드로 처리할 작업 for(int i = 0; i < 100; i++) { try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } //이 자리에서 프로그레스 수치를 변화시키고 싶으면 // onProgressUpdate(); publishProgress(); } return null; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub // 파생쓰레드로 처리할 작업 FileInputStream fi = null; FileOutputStream fo = null; byte[] buf = null; buf = new byte[1024]; for(int i = 0; i < fileSize; i++) try { Thread.sleep(100); fi = new FileInputStream(ORIGIN_FILE); fo = new FileOutputStream(DEST_FILE); int length; while ((length = fi.read(buf)) > 0) { fo.write(buf, 0, length); publishProgress(length); // UI쓰레드 튀어나와서 onProgressUpdate() 해라 i+=length; } fo.flush(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 이 자리에서 프로그레스 수치를 변화시키고 싶음 // onProgressUpdate(); 이러면안되고 catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class FileCopyMsgHandler extends Handler{//안드로이드에서 제공하는 쓰레드의 메시지 큐 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Toast.makeText(MainActivity.this, msg.obj.toString(), 1).show(); Toast.makeText(MainActivity.this,"메시지 종류 : "+ msg.what, 1).show(); Toast.makeText(MainActivity.this,"메시지 인자1 : "+ msg.arg1, 1).show(); Toast.makeText(MainActivity.this,"메시지 인자2 : "+ msg.arg2, 1).show(); } } private Handler handler = new FileCopyMsgHandler(); class FileCopyThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub Message msg = handler.obtainMessage();//빈 메시지 획득 msg.what = 1; msg.arg1 = 100; msg.arg2 = 200; msg.obj = "메시지다 임마"; handler.sendMessage(msg); } } | cs |
what
what 이 1이면 파일복사를 시작하겠다는 코드 , obj1에는 복사할 파일의 용량 정보를 전달
what 1을 수신한 handleMessage는 obj1 값을 max로 하는 프로그레스 다이얼로그 생성해서 show
what 2는 현재 진행한 만큼의 값을 전달하는 메시지 obj1에 처리한 바이트 수를 전달
what2를 수신한 handleMessage는 obj1값 만큼 incrementProgressby에 넣어서 프로그레스 진행
what3은 파일 복사가 완료됐다는 메시지
what3을 수신한 handleMessage는 프로그레스 다이얼로그를 dismiss해서 없애버림
' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글
Day102 안드로이드 (0) | 2016.08.11 |
---|---|
Day101 (0) | 2016.08.10 |
Day98_2 안드로이드 OpenHelper (0) | 2016.08.05 |
Day98 안드로이드 db Select문 (0) | 2016.08.05 |
Day97 (0) | 2016.08.04 |