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

안드로이드 초보 쓰레드(thread) 를 이용한 ping 보내기

0 추천

현재 연결되어있는 각각의 컴퓨터들에게 ping을 보내어 보내어지면 화면에 on 이라는 아이콘을 실패가 나오면 false 라는 아이콘이 나오도록 하려고합니다. 

멀티핑으로 범위를 줘서 그범위 안에 있는 ip를 가져와서 날리는 거구요..

문제는 처음 한번은 잘됩니다. 하지만 한번 더  눌럿을때 어플이 중지되면서 밖으로 나오는 현상이 발생합니다. 

isAlive 함수를 이용하여 쓰레드가 살아있어서 그런지 확인해 보았지만 죽어있는 상태인데도 쓰레드가 돌지 않는 것 같습니다. 

아시는분은 조언부탁 드리겟습니다.ㅠ

매인소스

package com.example.ping;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import com.example.ping.CopyOfMainActivity.PingTask;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	 PingTask mTask;
	 TextView result;
     TextView text_result;
     Handler handler = new Handler();
     EditText source_ip_1;
     EditText source_ip_2;
     EditText source_ip_3;
     EditText source_ip_4;
     EditText dest_ip_1;
     EditText dest_ip_2;
     EditText dest_ip_3;
     EditText dest_ip_4;
     ImageView check_on_off1;
     ImageView check_on_off2;
     ImageView check_on_off3;
     ImageView check_on_off4;
     ImageView check_on_off5;
    ArrayList<Integer> arrayitem = new ArrayList<Integer>();
     public int j=0;
     Make_IP ip_machine;
     ArrayList<String> result_list;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		source_ip_1 = (EditText) findViewById(R.id.source_ip_1);
        source_ip_2 = (EditText) findViewById(R.id.source_ip_2);
        source_ip_3 = (EditText) findViewById(R.id.source_ip_3);
        source_ip_4 = (EditText) findViewById(R.id.source_ip_4);

         dest_ip_1 = (EditText) findViewById(R.id.dest_ip_1);
         dest_ip_2 = (EditText) findViewById(R.id.dest_ip_2);
         dest_ip_3 = (EditText) findViewById(R.id.dest_ip_3);
         dest_ip_4 = (EditText) findViewById(R.id.dest_ip_4);
         check_on_off1 = (ImageView)findViewById(R.id.check01);
         check_on_off2 = (ImageView)findViewById(R.id.check02);
         check_on_off3 = (ImageView)findViewById(R.id.check03);
         check_on_off4 = (ImageView)findViewById(R.id.check04);
         check_on_off5 = (ImageView)findViewById(R.id.check05);
         
         arrayitem.add(R.id.check00);
         arrayitem.add(R.id.check01);
         arrayitem.add(R.id.check02);
         arrayitem.add(R.id.check03);
         arrayitem.add(R.id.check04);
         arrayitem.add(R.id.check05);
        
         
         result = (TextView)findViewById(R.id.textView3);
        Button ok_button = (Button) findViewById(R.id.okbutton);
        Button clear_button =(Button) findViewById(R.id.cancelbutton); 
        text_result = (TextView) findViewById(R.id.text_result);

        clear_button.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				result.setText(" ");
				text_result.setText(" ");
				
			}
		});
        ok_button.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                	ip_machine = new Make_IP(source_ip_4, dest_ip_4);
        			result_list = ip_machine.get_ip(
                                  source_ip_1, source_ip_2, source_ip_3);
        			
        			if(ping.isAlive())Log.i("ping","thread run1.");
        			else Log.i("ping","thread die1");
        			ping.start();
        			if(ping.isAlive())Log.i("ping","thread run2.");
        			else Log.i("ping","thread die2");
                }
        });
	}

	
	Thread ping = new Thread(new Runnable() {
		String re="";
		@Override
		public void run() {
			
			for (int i = 0; i < result_list.size(); i++) {
				Log.i("ping","resultlist="+result_list.size());
				j=i;
				try {
					if (InetAddress.getByName(result_list.get(i)).isReachable(3000) == true) {

								handler.post(new Runnable() {
									
									@Override
									public void run() {
										
										Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_check_ok);
										ImageView ch = (ImageView)findViewById(arrayitem.get(j));
										
										ch.setImageBitmap(bm);
									}
								});
																		     	
					    } else {
					    
					    			handler.post(new Runnable() {	
										@Override
										public void run() {
											Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_check_fail);
											ImageView ch = (ImageView)findViewById(arrayitem.get(j));
											ch.setImageBitmap(bm);
											
										}
									});
					    }
				} catch (UnknownHostException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				}
			handler.post(new Runnable() {
				
				@Override
				public void run() {
					
					Log.i("ping",re);
					
				}
			});
		
		}
	});
	
}
	
	

에러메시지

07-28 20:57:01.008: D/AndroidRuntime(1351): Shutting down VM
07-28 20:57:01.008: W/dalvikvm(1351): threadid=1: thread exiting with uncaught exception (group=0x40c271f8)
07-28 20:57:01.013: E/AndroidRuntime(1351): FATAL EXCEPTION: main
07-28 20:57:01.013: E/AndroidRuntime(1351): java.lang.IllegalThreadStateException: Thread already started.
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at java.lang.Thread.start(Thread.java:1045)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at com.example.ping.MainActivity$3.onClick(MainActivity.java:105)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.view.View.performClick(View.java:3620)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.view.View$PerformClick.run(View.java:14292)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.os.Handler.handleCallback(Handler.java:605)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.os.Handler.dispatchMessage(Handler.java:92)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.os.Looper.loop(Looper.java:137)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at android.app.ActivityThread.main(ActivityThread.java:4507)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at java.lang.reflect.Method.invoke(Method.java:511)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-28 20:57:01.013: E/AndroidRuntime(1351): 	at dalvik.system.NativeStart.main(Native Method)

 

 
 
 
tosongfx (130 포인트) 님이 2014년 7월 28일 질문

1개의 답변

+1 추천
start 함수는 한 번만 호출해야 합니다.

지금 코드는 클릭할 때마다 호출하게 되어있습니다.
익명사용자 님이 2014년 7월 28일 답변
...