[英]Starting an activity as a Thread?
我目前正在努力創建我最近編寫的“戰艦”程序的移動(Android)版本。 盡管我的GUI到現在已經完成,並且程序的大多數部分都可以工作,但我(至少)還有一個主要問題:我的程序的主要部分,除了服務器部分(它將對用戶輸入等做出反應)依賴於Java NIO,即網絡訪問。 但是,由於它在主線程上運行,因此我收到
java.lang.RuntimeException: Unable to start activity ComponentInfo{x.battleship/x.battleship.BattleshipMain}: android.os.NetworkOnMainThreadException`
(出於隱私原因,我用x替換了軟件包名稱)。
因此,我的問題是:如何將活動作為新線程啟動? 到目前為止,我已經使用
Intent i = new Intent(getApplicationContext(), BattleshipMain.class);
startActivity(i);
i.putExtra("ip",joinip);
i.putExtra("port",joinport);
起初,我認為這將是另一種選擇:
new Thread(new Runnable() {
@Override
public void run() {
Intent i = new Intent(getApplicationContext(), BattleshipMain.class);
startActivity(i);
i.putExtra("ip",joinip);
i.putExtra("port",joinport);
}
});
但是,它似乎不起作用-我在控制台中收到一條消息,即BattleshipMain
已啟動,但顯示屏上實際上沒有顯示任何東西(除了已經存在的東西)。 有人知道該怎么做嗎? 我真的不知道該怎么解決。 不過,我還是Android的新手,也不是Java的長期專家。
提前致謝!
// edit:如果我應該這樣做,我不太熟悉,但是在將網絡代碼移到單獨的線程后,在我看來,我無法將手機上的應用程序連接到服務器在我的PC上運行。 它們在同一網絡中,並且服務器應與移動應用程序兼容,但是考慮到我收到的錯誤/凍結屏幕,我看不出還有什么其他問題。 Java NIO是否可以在android上正常運行?我是否可以將手機(Galaxy S3,btw-> API 18)上的客戶端連接到裝有Windows的PC上的服務器? 謝謝! :)
// edit:沒關系,錯誤是100%愚蠢的。 當使用Intent創建新活動時,我創建了Intent,將其啟動,然后使用了intentname.putExtra(key,value)-這顯然行不通。 現在,我又遇到了另一個錯誤,因為我試圖從另一個線程更改一個復選框,但是網絡部分起作用了,所以我想很快就可以完成。
您遇到的問題是您正在主線程上進行網絡連接,這是被禁止的。 將所有網絡和網絡/ api調用移到AsyncTask
,這應該很好。
編輯:除此之外,請放棄將活動作為線程啟動的想法,因為活動具有其自己的生命周期,在此進行描述
EDIT2:也許如果您設法關閉StrictMode(在開發人員選項中可用),則可以在主線程上進行聯網,但是...我不會指望它。
你不能 您只有一個UI線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.