簡體   English   中英

以線程開始活動?

[英]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.

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