[英]How to Socket/Thread in Android API 25
我在API 25中遇到了套接字和線程問題。我在使用7.1.1的Nexus 6p上直接定位了API 25
嘗試與端口8124上的節點服務器通信時,我初始化了一個新線程並初始化了一個套接字,但是我在mainthreadexception上得到了一個網絡
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連接。
當應用程序嘗試在主線程中執行聯網操作時,將引發此異常。 在onViewCreated
使用以下代碼可以避免此錯誤,否則請對網絡調用使用AsynkTask。
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
當您獲得networkonmainthreadexception時,這意味着您的線程已正確啟動,並且未打印出Log.i的唯一原因是因為在打印之前引發了錯誤。 像這樣將您的Log.i移動到套接字代碼上方,您會看到它正在打印:
Log.i("SOCKET", "Was the thread started?");
socket = new Socket("192.168.1.57", 8124);
現在知道您的線程已正確啟動,您可以專注於主要問題networkmainthreadexception。
幸運的是,該問題的答案在這里: 如何修復android.os.NetworkOnMainThreadException?
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.