2015-01-18 3 views
2

Я строю простую систему клиент-сервер. Я построил сервер Java & клиент android, который работает на моем устройстве (оба подключены к той же локальной сети).Ошибка клиента Android - java.lang.IllegalStateException: Не удалось выполнить метод активности

Когда я просто пытаюсь установить соединение (нажатием кнопки) клиент завершает работу с ошибкой

-"java.lang.IllegalStateException: Could not execute method of the activity" 

В других ответах, чтобы закрыть проблему было сказано, что он может быть подключен к AsyncTask, но Я не уверен.

код сервера:

import java.io.IOException; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    import java.io.ObjectInputStream; 
    import java.io.ObjectOutputStream; 

    public class Server { 
     public static void startConnection(int portNum) 
     { 
      ServerSocket serverSocket=null; 
      Socket clinetSocket=null; 
      ObjectOutputStream serverOut=null; 
      ObjectInputStream serverIn=null; 
      String message=null; 

      //create a socket 
      try{ 
       serverSocket=new ServerSocket(portNum); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Waiting for connection..."); 
      try{ 
       clinetSocket = serverSocket.accept(); 
      } 
      catch (IOException e){ 
       e.printStackTrace(); 
      } 

      System.out.println("connected to "+ clinetSocket.getInetAddress().getHostName()); 

     } 

Android код клиента:

Main.java : 

    package com.example.user_pc.myapplication; 
    import android.support.v7.app.ActionBarActivity; 
    import android.os.Bundle; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 
    import java.net.Socket; 
    import java.io.IOException; 
    import java.net.UnknownHostException; 
    import java.net.SocketException; 
    import android.util.Log; 
    import java.io.ObjectInputStream; 
    import java.io.ObjectOutputStream; 

    public class Main extends ActionBarActivity { 

     TextView text; 

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

      text= (TextView) findViewById(R.id.textView1); 
      text.setText(""); 
     } 

     public void pushTheButton(View v) 
     { 
      Button button = (Button) findViewById(R.id.button); 
      createSocket(); 
     } 
     public void createSocket() 
     { 
      Socket sock = null; 
      String dstIP = "192.168.2.103";//server ip 
      int dstPort = 9632; 


      try 
      { 
       sock = new Socket(dstIP, dstPort); 
      } 

      catch(SocketException ie) 
      { 
       Log.wtf("SocketException",ie); 
      } 

      catch(UnknownHostException ie) 
      { 
       Log.wtf("UnknownHostException",ie); 
      } 
      catch(IOException ie) 
      { 
       Log.wtf("IOException",ie); 
      } 

    } 

     public static void main(String[] args) 
     { 
      int portNum=9632; 
      startConnection(portNum); 
     } 

    ``} 

manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.user_pc.myapplication" > 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".Main" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

файл макета:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".Main" 
    android:onClick="pushTheButton"> 

    <Button 
     android:layout_width="300dp" 
     android:layout_height="100dp" 
     android:text="Click to connect" 
     android:id="@+id/button" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginTop="96dp" 
     android:onClick="pushTheButton" 
     /> 
</RelativeLayout> 
  • Logcat

    01-19 16: 28: 02,425 10779-10779/com.example.user_pc.myapplication Е/AndroidRuntime: неустранимым: Главный java.lang.IllegalStateException: Не удалось выполнить метод от деятельности на android.view.View $ 1.onClick (View.java:3599) на android.view.View.performClick (View.java:4204) на android.view.View $ PerformClick.run (Просмотр. java: 17355) на android.os.Handler.handleCallback (Handler.java:725) на android.os.Handler.dispatchMessage (Handler.java:92) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:5226) на java.lang.reflect.Method.invokeNative (собственный метод) на java .lang.reflect.Method.invoke (Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:562) на dalvik.system.NativeStart.main (Родной метод) Вызванный: java.lang.reflect.InvocationTargetException на java.lang.reflect.Method.invokeNative (нативный метод) на Java. lang.reflect.Method.invoke (Method.java:511) на android.view.View $ 1.onClick (View.java:3594) на android.view.View.performClick (View.java:4204) на android.view.View $ PerformClick.run (View.java:17355) на android.os.Handler.handleCallback (Handler.java:725) на android.os.Handler.dispatchMessage (Handler.java:92) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:5226) at java.lang.reflect.Method.invokeNative (собственный метод) at java.lang.reflect.Method.invoke (Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 795) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:562) на dalvik.system.NativeStart.Основной (Native Method) Вызванный: android.os.NetworkOnMainThreadException в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1117) в libcore.io.BlockGuardOs.connect (BlockGuardOs.java:84) в libcore.io.IoBridge.connectErrno (IoBridge.java:127) на libcore.io.IoBridge.connect (IoBridge.java:112) на java.net.PlainSocketImpl.connect (PlainSocketImpl.java:192) на java. net.PlainSocketImpl.connect (PlainSocketImpl.java:172) на java.net.Socket.startupSocket (Socket.java:566) на java.net.Socket.tryAllAddresses (Socket.java:127) на java.net. Socket. (Socket.java:177) на java.net.Socket. (Socket.java:149) на com.example.user_pc.myapplication.Main.createSocket (Main.java:50) на com.example.user_pc.myapplication.Main.pushTheButton (Main.java:35) на java.lang.reflect.Method. invokeNative (Native Method) at java.lang.reflect.Method.invoke (Method.java:511) на android.view.View $ 1.onClick (View.java:3594) на android.view.View.performClick (View.java:4204) на android.view.View $ PerformClick.run (View.java:17355) на android.os.Handler.handleCallback (Handler.java:725) на android.os.Handler.dispatchMessage (Handler.java:92) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:5226) на java.lang.reflect.Method.invokeNative (собственный метод) на java. lang.reflect.Method.invoke (Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:562) на dalvik.system.NativeStart.main (Родной метод)

+0

Опубликовать logcat, который будет содержать сообщения об ошибках и stacktrace. –

+0

Вы не должны делать ввод-вывод в основном потоке (UI). Для выполнения сетевых операций ввода/вывода необходимо использовать фоновый поток (oir 'AsyncTask'). –

+0

@DavidWasser Logcat добавлен. – gil

ответ

0

Точно так, как я сказал. Вы получаете NetworkOnMainThreadException. Вы должны делать сетевой ввод-вывод в фоновом потоке. Ваш метод createSocket() должен начать новый фоновый поток для выполнения этой работы. Или используйте AsyncTask.

+0

Отлично работает! Спасибо ! – gil

Смежные вопросы