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

예외 : 런타임 에러, 프로그램 실행 중 어떤 이유로 뻗는거 // 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의하여 발생하는 오류


예외처리 : 런타임에러가 생겼을때 어떻게 대응할지에 대한 명세를 작성해 주는거-> 그러면 예외가 발생해도 프로그램이 뻗지 않고 계속 동작.


예외의 종류 3 : Error (시스템에서 발생) // RuntimeException (선택적으로 예외 처리) // IOException (예외 처리 필수)


체크 예외 : 컴파일러가 예외 처리를 강요

비체크 예외 : 컴파일러가 신경 안쓰는 예외






public static String readString() throws IOException{

//해당 함수의 몸통안에 IOExeption을 발생시키는 코드를 예외처리하지 않고 사용가능//해당 함수를 호출하는 녀석은 IOException에 대한 책임을 가짐




class DivideByZeroException extends ArithmeticException{

public DivideByZeroException()

{

super("0으로 나눌수는 없음.");

}

}

public class ExceptionTest {

public static void main(String[] args) {

double result;

try{

result = quotient(1,0);

}

catch(DivideByZeroException e){

System.out.println(e.toString());

}

}

public static double quotient(int n, int d)

throws DivideByZeroException

{

if( d == 0)

throw new DivideByZeroException();

return(double) n/d;

}

}



finally 블록의 절대적 필요성은 try나 catch구문에서 함수 return등으로,, 이 다음 코드로 진행이 아닌 경우 처리해야 될 코드를 수행하기 위해



' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day20 입출력  (0) 2016.04.08
Day19 스레드  (0) 2016.04.07
Day17 제네릭과 컬렉션  (0) 2016.04.05
Day16 패키지  (0) 2016.04.04
Day15 전략패턴  (0) 2016.04.01

+ Recent posts