2016-08-09 28 views
-1

誰能告訴我爲什麼我在handleMessageAndroid的處理程序的handleMessage

+0

嘗試使用AsyncTasks,它更容易,更清潔。 –

+0

也許它是,但問題是如果我在'AsyncTask'的'doInbackground'中使用'onPictureTaken'我得到'onPictureTaken'同樣的錯誤 – SimpleCoder

+0

你能分享logcat日誌嗎? –

回答

0

讓網絡上的主線程異常,因爲你在主線程和在其上創建工作處理程序的實例。在heandler中,你嘗試在主線程中創建套接字連接(internet連接)。

/** 
    * Default constructor associates this handler with the {@link Looper} for the 
    * current thread. 
    * 
    * If this thread does not have a looper, this handler won't be able to receive messages 
    * so an exception is thrown. 
    */ 
    public Handler() ; 
0

我猜你所遇到的例外,由於Toast.makeText(getApplicationContext(), count, Toast.LENGTH_LONG).show();

嘗試使用一個新的線程:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     showToast(MessageBuilder.SUCCESSFUL_COMMENT); 
     } 
    }); 
0

您需要在後臺運行您的處理程序。您可以使用Looper。 請參閱https://developer.android.com/reference/android/os/Looper.html

你可以試試這個:

Thread thread = new Thread() { 
     @Override 
     public void run() { 
      super.run(); 
      Looper.prepare(); 

      handler = new Handler() { 
       @Override 
       public void handleMessage(Message msg) { 
        super.handleMessage(msg); 
        try { 
         String tmp = msg.obj.toString(); 
         InetAddress serverAddr = InetAddress.getByName(serverIP); 
         socket = new Socket(serverAddr, serverPort); 
         OutputStream outStream = socket.getOutputStream(); 
         PrintWriter writer = new PrintWriter(outStream); 
         writer.write(tmp); 
         writer.flush(); 
         InputStream inStream = socket.getInputStream(); 
         byte[] xxx = new byte[20]; 
         int count = inStream.read(xxx); 
//   Toast.makeText(getApplicationContext(), count, Toast.LENGTH_LONG).show(); 

         outStream.flush(); 
         outStream.close(); 

        } catch (UnknownHostException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } finally { 
         Looper.myLooper().quit(); 
        } 
       } 

      }; 
      handler.removeCallbacks(this); 
      Looper.loop(); 
     } 
    }; 

    thread.start(); 

你也都出現在你的處理程序Toast這將導致RuntimeError。請從處理程序中刪除Toast。

+0

好的,它應該是什麼樣子?你能告訴我這是基於我的代碼嗎? – SimpleCoder

+0

我試圖解決這個問題,但我總是有'網絡主線程異常'由Inputstream – SimpleCoder

+0

@SimpleCoder引起我已經更新了答案,請檢查。 –