2012-11-24 24 views
0

感謝我得到它通過使用切換值,按照該按鈕,工作正在運行的線程崩潰裏面的Android按鈕

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); 
         } 

每當我點擊按鈕的代碼執行,然後它的任務崩潰

繼承人我的Android代碼:

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) 

注意:服務器端接受沒有問題的連接也會在客戶端崩潰之前接受來自客戶端的數據

+0

你有困擾,甚至對致命的異常信息進行搜索? –

+0

@Mohamed Gamal只看我的[答案](http://stackoverflow.com/questions/13545151/error-with-calling-a-web-service-and-recieving-data/13545301#13545301),你應該使用異步要做到這一點 – kamil

回答

0

檢查了這一點http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html。根據官方文檔,如果您使用的是Honeycomb SDK或更高版本,則不應將網絡操作放在主/ UI線程上。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但由於它會阻止用戶界面並導致ANR,因此非常不鼓勵。

您需要使用後臺線程或AsyncTask進行網絡操作以避免發生此異常。

作爲一般規則,總是會在後臺線程或AsyncTask中放置耗時的任務。

1

根據this。當應用程序嘗試在其主線程上執行聯網操作時引發的異常。

的問題是這條線

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

當你做你的b.setOnClickListenerView.OnClickListener()因此ClientHandler由UI線程,而不是產生THEAD執行。後來的UI線程嘗試執行上述操作,其中包含socket.getOutputStream(),因此例外

這主要是因爲,像其他許多其他Android工具包不是線程安全的。 UI Thread執行所有的UI操作。網絡操作通常有與之相關的延遲。如果Ui線程忙於網絡,它如何在屏幕上渲染任何東西?

+0

套接字沒有在用戶界面上運行,我已經嘗試過異步它不會幫助我的情況,因爲異步運行一次它的調用..我需要保持套接字運行發送和接收 –

+0

我已經修改了答案,你是accessign套接字。來自ur UI線程的getOutputStream – Jatin

1

更改這一部分並添加runOnUiThread:

runOnUiThread(new Runnable() 
{ 
    public void run() 
    { 
     b.setOnClickListener(new View.OnClickListener() {...}); 
     // and also Logs 
    } 
}); 
+0

在此之後,LogCat拋出異常,'ClientHandler()'方法似乎是問題所在。 (雖然這不會拋出某種類型的CalledFromWrongThreadException ...我不知道) – Sam

+0

我寫道,還有日誌和所有UI元素:按鈕,textViews等:runOnUiThread(new Runnable() { public void運行() b.setOnClickListener(new View.OnClickListener(){...}); Log.d(「ClientActivity」,「C:Sending command。」); txt.setText(「Closed Socket」) ; } }); –