2017-04-20 53 views
0

林具有API 25 IM在我的Nexus 6P直接针对API 25套接字和线程问题7.1.1如何插座的Android API /线程25

当试图在端口我的节点服务器进行通信8124我初始化一个新的线程并初始化一个插座,但我要么得到一个networkonmainthreadexception

public class MainActivity extends AppCompatActivity { 

private Socket socket; 

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

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

    StrictMode.setThreadPolicy(policy); 

    Button LoginButton = (Button) findViewById(R.id.button2); 
    LoginButton.setOnClickListener(
      new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        TryLogin(v); 
       } 
      } 
    ); 
} 

public void TryLogin(View v){ 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       socket = new Socket("192.168.1.57", 8124); 
       Log.i("SOCKET", "Was the thread started?"); 
      } catch(UnknownHostException e1){ 

      } catch (IOException e1){ 

      } 
     } 
    }).start(); 
} 

}

当我调用start()方法我从来没有看到“是线程开始了吗?”。 logcat中也没有引发任何错误。但是当我改变运行()我得到networkonmainthreadexception错误。它好像有什么变化一样接缝。我证实使用节点客户端显示了到我的节点服务器的tcp连接。

+0

忽略线程策略我正在测试 – lzRipTide3zl

+0

请完全删除StrictMode。 – greenapps

+0

你不应该像你所看到的那样,因为它不再是线程,所以当然不应该调用run。当每个人都攻击NetworkOnMainThreadException时,你会发出令人困惑的帖子,你可以在下次再写这个吗?,而你有一个SocketTimeoutException。 – greenapps

回答

0

当你得到networkonmainthreadexception,这意味着你的线程已经正确启动并且Log.i没有被打印出来的唯一原因是因为错误在打印之前被抛出。移动你的Log.i插座这样的代码上面,你会看到它正在打印:

Log.i("SOCKET", "Was the thread started?"); 
socket = new Socket("192.168.1.57", 8124); 

现在知道你的线程启动正确,可以重点关注的主要问题是networkmainthreadexception。

,幸运的是,这个问题的答案的问题是在这里:How to fix android.os.NetworkOnMainThreadException?

希望这有助于!

+0

好吧,我现在收到日志消息,但没有在我的节点控制台中看到连接。我也没有看到IoException的e1.printStackTrace()或UnknowHostException的错误 – lzRipTide3zl

+0

你不是说networkonmainthreadexception是抛出的错误吗?您可以通过在AsyncTask中运行该套接字代码来解决该问题。更多的可以在这里找到:http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception – DiderDrogba344

+0

添加另一个捕获异常,只记录和rethrows。我想它会是一个不同的异常类型,而不是你正在捕捉的两个异常类型。 – Fildor

1

当应用程序尝试在主线程中执行联网操作时,会引发此异常。在您的onViewCreated中使用下面的代码以避免此错误,否则使用AsynkTask进行网络呼叫。

if (android.os.Build.VERSION.SDK_INT > 9) { 
       StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
      } 
+0

AsyncTask或线程将是我想的相同。为什么会有所不同? – greenapps

+0

'if(android.os.Build.VERSION.SDK_INT> 9)'应该是'if(android.os.Build.VERSION.SDK_INT <0)'。 – greenapps

+0

android.os.Build.VERSION.SDK_INT> 9,因为由于HoneyComb无法在主线程上进一步执行网络任务。 –