0

ボタンでトグル値を使用して動作させていただきありがとうございます

public void onClick(View v) {
                               // TODO Auto-generated method stub

                             doit=1;
                             Log.e("ErrorButton","NextTime "+doit);
                           }
                       });  
                      if(doit==1)
                      {
                          Log.e("ErrorButton","If");
                      ////
                          out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); 
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                

                        out.println("Helloo");

                        while ((text = in.readLine()) != null) {
                            finall += text;
                            Log.e("Test","Final: "+finall);
                          if(text=="quit")
                          {
                              socket.close();
                          }
                      Log.e("ClientActivity", "After Read "+doit+" "+finall);
                     // in.close();

                       doit=0;
                       Log.e("ClientActivity", "After If "+doit);
                      } 

ボタンをクリックするたびに、コードがタスクを実行してからクラッシュします

Heres私のアンドロイドコード:

package com.example.socketclient;


import android.R.string;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream;
import java.io.OutputStreamWriter; 
import java.io.InputStreamReader;
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import android.util.Log; 

public class SocketCode extends Activity {
    private boolean connected = false;
    //private Handler handler = new Handler();
    public TextView txt;
    protected SocketCore Conn;
    public Button b;
    public EditText TextToSend;
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_socket_code);
        b = (Button)findViewById(R.id.button1);
        txt = (TextView)findViewById(R.id.textView1);
        TextToSend = (EditText)findViewById(R.id.editText1);
        //Conn = new SocketCore(this,txt);

        Thread cThread = new Thread(new ClientThread());
        cThread.start();

    }
    public class ClientThread implements Runnable {
        Socket socket ;
String finall;
        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName("192.168.0.150");
                Log.d("ClientActivity", "C: Connecting...");
                socket= new Socket(serverAddr,4444);
                connected = true;
                while (connected) {
                    try {
                        Log.d("ClientActivity", "C: Sending command.");

                       b.setOnClickListener(new View.OnClickListener() {

                           public void onClick(View v) {
                               // TODO Auto-generated method stub

                               ClientHandler("Hex");

                           }
                       });  




                            Log.d("ClientActivity", "C: Sent.");


                    } catch (Exception e) {
                        Log.e("ClientActivity", "S: Error", e);
                    }
                    Thread.sleep(2000);
                }
                socket.close();
                txt.setText("Closed Socket");
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
        }

        public void ClientHandler(String Send)
        {
            try{
              PrintWriter   out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                       .getOutputStream())), true);
          out.println(Send);
           BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           finall = in.readLine();

           txt.setText(finall);
            }
            catch(IOException e)
            {txt.setText("Exception");}
        }


    }

}

エラーログは次のとおりです。

11-24 23:44:12.920: E/AndroidRuntime(10046): FATAL EXCEPTION: main
11-24 23:44:12.920: E/AndroidRuntime(10046): android.os.NetworkOnMainThreadException
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.InputStreamReader.read(InputStreamReader.java:244)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.io.BufferedReader.readLine(BufferedReader.java:354)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.example.socketclient.SocketCode$ClientThread.ClientHandler(SocketCode.java:103)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.example.socketclient.SocketCode$ClientThread$1.onClick(SocketCode.java:66)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.view.View.performClick(View.java:4211)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.view.View$PerformClick.run(View.java:17267)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Handler.handleCallback(Handler.java:615)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.os.Looper.loop(Looper.java:137)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at android.app.ActivityThread.main(ActivityThread.java:4898)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.lang.reflect.Method.invokeNative(Native Method)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at java.lang.reflect.Method.invoke(Method.java:511)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
11-24 23:44:12.920: E/AndroidRuntime(10046):    at dalvik.system.NativeStart.main(Native Method)

注:サーバー側は問題なく接続を受け入れ、クラッシュする前にクライアントからのデータも受け入れます

4

4 に答える 4

1

これによると。アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。

問題はこの行です

PrintWriter   out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                   .getOutputStream())), true);

実行b.setOnClickListenerするView.OnClickListener()ClientHandler、生成された広告ではなく、UI スレッドによって実行されます。socket.getOutputStream()後の UI スレッドは、例外を含む上記の操作を実行しようとします。

これは主に、他の多くの Android ツール キットと同様にスレッド セーフではないためです。UI ThreadすべてのUI操作を実行します。通常、ネットワーク操作には遅延が伴います。Ui スレッドがネットワーク処理でビジーな場合、どうすれば画面に何かをレンダリングできますか?

于 2012-11-24T21:55:48.227 に答える
1

この部分を変更して、runOnUiThread を追加します。

runOnUiThread(new Runnable() 
{
    public void run() 
    {
        b.setOnClickListener(new View.OnClickListener() {...});
        // and also Logs
    }
});
于 2012-11-24T22:06:15.830 に答える
0

これをチェックしてくださいhttp://developer.android.com/reference/android/os/NetworkOnMainThreadException.html。公式ドキュメントによると、Honeycomb SDK 以上を使用している場合は、ネットワーク操作をメイン/UI スレッドに配置しないでください。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、UI をブロックし、ANR を引き起こす可能性があるため、推奨されません。

AsyncTaskこの例外を回避するには、バックグラウンド スレッドまたはネットワーク操作を使用する必要があります。

原則として、時間のかかるタスクは常にバックグラウンド スレッドまたはAsyncTask.

于 2012-11-24T21:51:54.893 に答える
0

厳密モードは、UI スレッドで特定の操作を検出するための開発者ツールです。詳細については、これをお読みくださいhttp://developer.android.com/reference/android/os/StrictMode.html

Strict モードは、Android バージョン 3.0 からデフォルトで有効になっています。

于 2012-11-24T21:58:06.107 に答える