以线程开始活动?

时间:2016-02-04 16:27:40

标签: java android

我目前正在努力创建我最近编码的“战舰”计划的移动(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的长期专家。

提前致谢!

//编辑:我不太熟悉,如果我应该这样做,但在我将网络代码移动到一个单独的线程后,在我看来,我无法在手机上连接该应用程序到我的电脑上运行的服务器。他们在同一个网络和服务器应该与移动应用程序兼容,但考虑到我收到的错误/冻结屏幕,我不知道还有什么可能是问题。 Java NIO在Android上是否正常工作/我是否可以将我的手机上的客户端(这是一个Galaxy S3,btw - > API 18)连接到带有Windows的PC上的服务器? 谢谢! :)

//编辑:nevermind,错误是100%愚蠢。当使用Intent创建一个新活动时,我创建了intent,启动了它,然后使用了intentname.putExtra(key,value) - 这显然不起作用。现在,我得到了另一个错误,因为我试图从另一个线程更改一个checkBox,但网络部分工作,所以我想我很快就会完成。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是您正在主线程上进行联网,这是禁止的。将所有网络和网络/ api呼叫移至AsyncTask,这应该是好的。

编辑: 除此之外,请放弃以线程开始活动的想法,因为活动有自己的生命周期which is described here

EDIT2:也许如果你设法关闭StrictMode(在开发者选项中可用),你可以在主线程上进行网络连接但是......我不会指望它。

答案 1 :(得分:2)

你做不到。你只有一个UI线程。