2014-11-16 3 views
1

님은 Android 애플리케이션을 사용하여 LED를 켜기위한 프로젝트 작업을하고 있으며 Wi-Fi와 통신합니다.android에서 thead 클래스를 사용하는 방법

문제는 리모컨으로 명령을 보내려면 버튼을 누를 때 응용 프로그램이 항상 중단된다는 것입니다. (Arduino + wifi 방패를 사용하고 있습니다). 나는 문제가 나의 스레드 구성과 실행이라고 생각한다. 아무도 안드로이드에서 제대로 스레드 클래스를 사용하는 내 문제를 해결할 수 있습니까? 여기

여기 스레드 클래스

package com.gfhz.appliancecontrol; 

import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.widget.Toast; 

public class ConnectionSocket extends Thread { 

    Socket client; 
    ConnectionInfoActivity conInfo; 
    String instructionCode; 
    String serverAddr; 
    OutputStream os; 
    DataOutputStream dos; 
    String stoast; 

    final int port = 2000; 

    ConnectionSocket(String instruction) { 
     // Get the DEVICE ID 
     String devId = conInfo.getDevId(); 
     // Concatenate instruction message and device Id 
     instructionCode = devId.concat(instruction); 

     // Get the SERVER IP ADDRESS 
     serverAddr = "192.168.1.105"; 
    } 

    @Override 
    public void run() { 
     //android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);   
     try{ 
      // Open a socket 
      client = new Socket(serverAddr, port); 

      dos = new DataOutputStream(client.getOutputStream()); 
      dos.writeBytes(instructionCode); 
     } catch (UnknownHostException e) { 
      //TODO Auto-generated catch block 
      e.printStackTrace(); 
      stoast = "Unknown Host Exception" + e.toString(); 
     } catch (IOException e) { 
      // TODO Auto-generated cach block 
      e.printStackTrace(); 
      // Display in TOAST 
      stoast = "IO Exception" + e.toString(); 
     } finally { 
      if (client != null) { 
       try { 
        client.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      //Toast.makeText(getTContext(), stoast, Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

그리고 스레드

package com.gfhz.appliancecontrol; 

import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

public class LightsMenuActivity extends MainActivity { 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.display_lights_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void powerLamp1 (View view) { 
     Thread cs = new ConnectionSocket("0401"); 
     cs.start(); 
    } 
    public void powerLamp2(View view) { 
     Thread cs = new ConnectionSocket("0402"); 
     cs.start(); 
    } 
    public void powerLamp3(View view){ 
     Thread cs = new ConnectionSocket("0403"); 
     cs.start(); 
    } 
} 

에게 로그 캣 오류를 실행하는 코드에 대한 내 코드입니다 :

11-16 19:49:21.127: E/AndroidRuntime(7457): FATAL EXCEPTION: main 
11-16 19:49:21.127: E/AndroidRuntime(7457): java.lang.IllegalStateException: Could not execute method of the activity 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.view.View$1.onClick(View.java:2154) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.view.View.performClick(View.java:2538) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.view.View$PerformClick.run(View.java:9152) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.os.Handler.handleCallback(Handler.java:587) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.os.Looper.loop(Looper.java:130) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.app.ActivityThread.main(ActivityThread.java:3693) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at dalvik.system.NativeStart.main(Native Method) 
11-16 19:49:21.127: E/AndroidRuntime(7457): Caused by: java.lang.reflect.InvocationTargetException 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at android.view.View$1.onClick(View.java:2149) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  ... 11 more 
11-16 19:49:21.127: E/AndroidRuntime(7457): Caused by: java.lang.NullPointerException 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at com.gfhz.appliancecontrol.ConnectionSocket.<init>(ConnectionSocket.java:25) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  at com.gfhz.appliancecontrol.LightsMenuActivity.powerLamp1(LightsMenuActivity.java:37) 
11-16 19:49:21.127: E/AndroidRuntime(7457):  ... 14 more 
+1

Pls에는 logcat 충돌 정보가 표시됩니다. –

+1

@RichardLeMesurier 오류 logcat sir을 추가했습니다. – grayfield

답변

0

귀하의 로그 캣가 표시됩니다 ConnectionSocket 클래스의 25 행에있는 NullPointerException

그래서 앱이 다운됩니다.


그 외에도 Android와 같은 백그라운드 스레딩 구현 (예 : AsyncTask)을 살펴 보는 것이 좋습니다.

원시 스레드 클래스보다 작업하기가 훨씬 쉽습니다.

관련 문제