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, 0length);
                        //파일 전부를 옮길때까지 이걸 반복
                    }
                    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, 0length);
                                //파일 전부를 옮길때까지 이걸 반복
                            }
                            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, 0length);
                          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

+ Recent posts