簡體   English   中英

為什么我的線程沒有像我認為的那樣做?(Android internet over main thread問題)

[英]Why does my thread not do what i think it does?(Android internet over main thread issue)

我對 android 應用程序中的 android 主線程有疑問。 所以當我執行第一塊代碼時,我得到了錯誤: android.os.NetworkOnMainThreadException 而且我不明白為什么,我正在啟動線程以及在線程啟動時執行任務。 為什么應用程序仍然在主線程上運行? 為什么第一個塊下面的代碼會起作用?

public class MainActivity extends AppCompatActivity {
    ClientSocket clientSocket = new ClientSocket();

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        clientSocket.start();
        try {
            clientSocket.startConnection("192.168.2.5", 45032);
            clientSocket.sendMessage("test");
        } catch (IOException e) {
            e.printStackTrace();
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
} 

什么最終起作用:

public class MainActivity extends AppCompatActivity {
    ClientSocket clientSocket = new ClientSocket();

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        new Thread(() -> {
            try {
                clientSocket.startConnection("192.168.2.5", 45032);
                clientSocket.sendMessage("test");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

正如您已經指出的那樣,在單獨的線程中打開套接字連接可以解決問題!

您在onCreate()方法中直接執行的所有內容都將在主線程上運行。 一般來說,您不應該在主線程上執行網絡任務,因為這可能會對您的應用程序的響應能力產生重大影響,尤其是在互聯網連接不良的地區。

因此,在單獨的線程中建立連接是正確的做法!

有關此特定錯誤的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM