如何在Android API 25中插入/线程

时间:2017-04-20 06:00:28

标签: java android multithreading sockets android-7.0-nougat

我在API 25中遇到套接字和线程问题。我直接针对带有7.1.1的Nexus 6p上的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中都没有抛出任何错误。但是当我改为run()时,我得到networkonmainthreadexception错误。它接缝好像发生了变化。我已经验证了使用节点客户端显示到我的节点服务器的tcp连接。

2 个答案:

答案 0 :(得分:1)

当应用程序尝试在主线程中执行网络操作时,抛出此异常。在onViewCreated中使用以下代码以避免此错误,否则请使用AsynkTask进行网络呼叫。

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

答案 1 :(得分: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?

希望这有帮助!