2017-11-27 31 views
0

私は自分のサーバーに接続し、Wi-Fi経由でテキストメッセージを他のユーザーに送信するAndroidアプリを作成しました。サーバーは正常に動作しますが、ログインするとクラッシュするアプリを使用しようとするたびに理由がわかりません。アプリがランダムにクラッシュする

logcat出力:

 
canner.findPatternInBuffer(Scanner.java:1022) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at java.util.Scanner.findWithinHorizon(Scanner.java:1694) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at java.util.Scanner.nextLine(Scanner.java:1555) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at com.thatadhacker.texting.MainActivity.onCreate(MainActivity.java:43) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.Activity.performCreate(Activity.java:6942) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.ActivityThread.-wrap14(ActivityThread.java) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.os.Looper.loop(Looper.java:154) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6682) 
11-27 17:13:43.089 32571-32571/? W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
public static Socket s; 
public static PrintWriter out; 
public static Scanner in; 
public static Button login; 
public static Button send; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    login = (Button) findViewById(R.id.button); 
    send = (Button) findViewById(R.id.button2); 
    login.setOnClickListener(this); 
    send.setOnClickListener(this); 
    new Thread(new Runnable(){ 
     public void run() { 
      try { 
       s = new Socket("finlaybot.soapfudge.com", 5567); 
       out = new PrintWriter(s.getOutputStream(), true); 
       in = new Scanner(s.getInputStream()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      EditText text = (EditText) findViewById(R.id.editText4); 
      while (true) { 
       text.append(in.nextLine()); 
      } 
     } 
    }).start(); 
} 
@Override 
public void onClick(final View view){ 
    new Thread(new Runnable(){ 
     public void run() { 
      switch (view.getId()) { 
       case R.id.button: 
        EditText user = (EditText) findViewById(R.id.editText); 
        EditText pass = (EditText) findViewById(R.id.editText2); 
        String username = user.getText().toString(); 
        String password = pass.getText().toString(); 
        out.println(username); 
        out.println(password); 
        user.setText(""); 
        pass.setText(""); 
        break; 
       case R.id.button2: 
        EditText to = (EditText) findViewById(R.id.textView); 
        EditText message = (EditText) findViewById(R.id.editText4); 
        out.println(to.getText().toString()); 
        out.println(message.getText().toString()); 
        to.setText(""); 
        message.setText(""); 
        break; 
      } 
     } 
    }).start(); 
} 

私は、サーバーが原因で正常に動作し、デスクトップクライアントで正常に動作します知っています。 *ログを取得しました

+2

クラッシュログ情報だけで、より徹底的にlogcatを確認していないフィルタlogcatしてみてくださいがあります – Erik

答えて

0

UI /メインスレッドではないスレッドからUIコントロールにアクセス/変更しようとしています。ログには次のようなものが表示されます。

ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

onCreateでハンドラを作成し、そのハンドラに送信するか、AsyncTaskLoaderを使用する必要があります。それは私がコードを見て考えることができる唯一の問題です。ログを添付してみてください。ハンドラの 例:

public class MainActivity extends AppCompatActivity { 
Button mButton; 
Handler mHandler; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mHandler = new Handler(); 
    mButton = (Button) findViewById(R.id.button); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        mButton.setText("rushan"); 
       } 
      }); 
      mButton.setText("new Text"); 
     } 
    }).start(); 
} 

}

関連する問題