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

아래의 에러 관련해서 어떻게 해결을 해주어야 할지 모르겠습니다 ㅠ ㅠ

0 추천

 

안녕하세요.

스레드를 사용하는 부분에서 어떻게 제 소스를 바꿔주어야 실행이 될지 모르겠습니다.

몇날며칠 이걸로 밤을 새는지 모르겠습니다 ㅠ 아래는 에러의 사진이고 그 아래는 에러의 코드를

적어보았습니다.

E/AndroidRuntime: FATAL EXCEPTION: Thread-4404
                  Process: com.example.milking.important, PID: 3636
                  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 com.example.milking.important.First.run(First.java:122)
                      at java.lang.Thread.run(Thread.java:831)

 

그리고 이 아래는 소스의 원문입니다.. 소스가 짤리는 부분은, 아래의 댓글부분에 좀 더 이어서

붙여보겠습니다.

package com.example.milking.important;

import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class First extends AppCompatActivity implements Runnable{

    boolean isActivityRun = true;
    Toolbar toolbar;

    private Socket socket;
    private DataInputStream dataInputStream;
    private DataOutputStream dataOutputStream;
    private byte[] buffer;

    private Thread thread;
    private String ip="192.168.11.6";

    private Button transferButton;
    private Button SmallButton1;
    private Button SmallButton2;

    private final static int TRANSFER=1;
    private final static int NOMOVEMENT=0;
    private int rwFlag;
    private boolean threadStopFlag;                   //스레드를 멈출지 말지 정하는 변수

    Button next;

 
Kind카인드 (3,600 포인트) 님이 2016년 11월 27일 질문
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        buffer=new byte[1];
        rwFlag=NOMOVEMENT;
        threadStopFlag=false;

        next = (Button) findViewById(R.id.open);
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rwFlag=TRANSFER;
                setNotify();

            }
        });

        thread=new Thread(First.this);
        thread.start();




        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowTitleEnabled(false);


        transferButton=(Button)findViewById(R.id.big_door);
        transferButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                transferButton.setSelected(true);
                SmallButton1.setSelected(false);
                SmallButton2.setSelected(false);

            }
        });


        SmallButton1=(Button)findViewById(R.id.small_door1);
        SmallButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SmallButton1.setSelected(true);
                SmallButton2.setSelected(false);
                transferButton.setSelected(false);

            }
        });

        SmallButton2=(Button)findViewById(R.id.small_door2);
        SmallButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SmallButton2.setSelected(true);
                SmallButton1.setSelected(false);
                transferButton.setSelected(false);
            }
        });


    }

    //실제 스레드가 돌아가는 곳
    @Override
    public void run() {
        try {
            Log.i("socket", "attemping connect");
            socket=new Socket(ip,4251);
            Log.i("socket","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(First.this, "IP가 맞지 않습니다.", Toast.LENGTH_SHORT).show();
        }

        while(true)
        {
            if(threadStopFlag)
            {
                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));
            switch(rwFlag)
            {
                case TRANSFER:
                    buffer[0]='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();
        }
    }



    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if(isActivityRun) {
                    return true;
                } else {
                    finish();
                    return false;
                }
            default:
                return false;
        }
    }


}

1개의 답변

0 추천
 
채택된 답변
FIrst.java  122 Line 코드를 올려주세요
빅배스 (4,260 포인트) 님이 2016년 11월 28일 답변
Kind카인드님이 2016년 11월 28일 채택됨
빅배스님 해결했습니다.

매번 정말 감사드립니다..

이시대의 인재
이시대의 희망
세상을 이끌어갈 엘리트
인류의 보물
인류의 마지막 보루

빅배스님 만세~
...