마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

프로그램이 작동시에, 시간이 얼마 지나지 않아 종료가 되어버립니다.(쓰레드) [closed]

0 추천

 

안녕하세요.

프로그램이 시작한지, 얼마 지나지 않아서 종료가 되어버리는데 그 이유를 잘 모르겠습니다 ㅠ

아무래도 스레드때문인것 같은데.. 어떻게 해결을 해야할지 모르겠습니다.

소스가 좀 추가되는 부분은 아래의 댓글 부분에 달아보겠습니다..

이유가 무엇인걸까요 ㅠ

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements Runnable{

   private Socket socket;                                //소켓
   private DataInputStream dataInputStream;
   private DataOutputStream dataOutputStream;
   private byte[] buffer;          
   private Thread thread;               //소켓통신은 스레드에서 돌아야 하므로 스레드 변수
   private String ip="192.168.11.8";      
   private Button transferButton;                
   private final static int TRANSFER=1;                  private final static int NOMOVEMENT=0;              private int rwFlag;                                private boolean threadStopFlag;                   //스레드를 멈출지 말지 정하는 변수

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main2);

      buffer=new byte[1];                                            //버퍼초기화
      rwFlag=NOMOVEMENT;                                            //최초상태는 NOMOVEMENT
      threadStopFlag=false;                                         //처음부터 true면 스레드가 안돌아간다.

     
질문을 종료한 이유: 해결을 했습니다..해결을 했습니다..해결을 했습니다..해결을 했습니다..해결을 했습니다..해결을 했습니다..
공산당 (1,960 포인트) 님이 2016년 11월 25일 질문
공산당님이 2016년 11월 29일 closed
transferButton=(Button)findViewById(R.id.transfer);                  //버튼 연결

        transferButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rwFlag=TRANSFER;                                                //rwFlag의 상태를 TRANSFER로 바꾸고
                setNotify();                                                     //스레드를 다시 동작하게 해서 t를 전송한다.
            }
        });                            //리스너 연결

        thread=new Thread(this);                                        //스레드를 만들고
        thread.start();                                                //동작시킨다.
    }


    //실제 스레드가 돌아가는 곳
    @Override
    public void run() {
        try {
            Log.i("socket", "attemping connect");
            socket=new Socket(ip,4251);                            //입력한 아이피, 4251포트로 접속을 시도한다.
            Log.i("socket","connect success");                     //성공했으면 connect success를 로그로 출력한다.
            dataInputStream=new DataInputStream(socket.getInputStream());
            dataOutputStream=new DataOutputStream(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("Input Error", "connect | dataInput | dataOutput error");
            Toast.makeText(MainActivity.this, "IP가 맞지 않습니다.", Toast.LENGTH_SHORT).show();
        }

        while(true)
        {
            if(threadStopFlag)           //만약 threadStopFlag가 true가 되서 스레드를 멈추라는 명령이 들어오면
            {
                try {
                    dataOutputStream.close();                                   //출력스트림을 종료한다.
                    Log.i("dataOutputStrema","dataoutputstream close");
                    dataInputStream.close();                                    //입력스트림도 종료한다.
                    Log.i("datainputStrema", "datainputstream close");
                    socket.close();                                             //소켓도 종료한다.(연결을 끊는다. 다른 기기에서는 연결이 끊겼는지 모른다. 해결방법 없음.)
                    Log.i("socket", "socket close");
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
                break;
            }
            Log.i("thread", String.valueOf(rwFlag));                            //지금 상태가 어떤지(SENSOR,transfer,NOMOVEMENT) 를 로그켓에 출력해본다.
            switch(rwFlag)
            {
                case TRANSFER:                                                  //전송버튼을 누르면
                    buffer[0]='t';                                               //버퍼에 t를 집어넣고.
                    try {
                        dataOutputStream.write(buffer);                          //다른기기 쪽으로 쏜다.
                        Log.i("write", "t");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
            }

            setWait();
        }
    }



    public synchronized void setNotify() {                                       //스레드를 다시 동작하게 하는 함수
        notify();
    }

    public synchronized void setWait()                                            //스레드를 멈추는 함수
    {
        //스레드가 계속 돌고 있거나 스레드를 죽였다가 다시 시작하게 하면
        // 비효율적이므로 별도의 명령이 있을때 까지 멈춰있게 한다.
        // 해당 메소드가 호출되고
        // 그냥 쓰레드를 멈추는것 하나할뿐인데

        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
에러 메세지도 같이 올려주세요~
답변 감사합니다..

에러는 아래와 같습니다.

E/AndroidRuntime: FATAL EXCEPTION: Thread-71855
                  Process: ex.nohuman, PID: 10698
                  java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                      at android.os.Handler.<init>(Handler.java:200)
                      at android.os.Handler.<init>(Handler.java:114)
                      at android.widget.Toast$TN.<init>(Toast.java:367)
                      at android.widget.Toast.<init>(Toast.java:113)
                      at android.widget.Toast.makeText(Toast.java:271)
                      at ex.nohuman.customer_access2.run(customer_access2.java:206)
                      at java.lang.Thread.run(Thread.java:831)
히로시님 해결을 했습니다..

제가 며칠 밤낮을 고민하고 있는 문제인데 한번 봐주시면 정말 감사드리겠습니다..

질문을 올렸던 아래의 링크를 달아봅니다...

http://www.masterqna.com/android/71486/%EC%A0%95%EB%A7%90-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4-%ED%95%9C%EB%B2%88%EB%A7%8C-%EC%82%B4%EB%A0%A4%EC%A3%BC%EC%84%B8%EC%9A%94-%EC%82%B4%EA%B3%A0%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4
...