【发布时间】:2016-02-04 16:27:39
【问题描述】:
我目前正在努力创建我最近编写的“战舰”程序的移动 (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 专家。
提前致谢!
//编辑:如果我应该这样做,我不太熟悉,但是在我将网络代码移动到单独的线程后,在我看来我无法连接手机上的应用程序到我的 PC 上运行的服务器。他们在同一个网络中并且服务器应该与移动应用程序兼容,但考虑到我收到的错误/冻结屏幕,我看不出还有什么问题。 Java NIO 是否可以在 android 上正常工作/我是否可以将手机上的客户端(这是 Galaxy S3,顺便说一句 -> API 18)连接到装有 Windows 的 PC 上的服务器? 谢谢! :)
//编辑:没关系,错误是 100% 愚蠢的。当使用 Intent 创建新活动时,我创建了 Intent,启动了它,然后使用了 intentname.putExtra(key, value) - 这显然不起作用。现在,我遇到了另一个错误,因为我试图从不同的线程更改复选框,但网络部分工作,所以我想我很快就会完成。
【问题讨论】:
-
您不能在非 UI 线程上运行 Activity。您需要将网络代码移动到 UI 线程上。您在 Activity 中拥有的网络代码。
-
NetworkOnMainThreadException中的关键字是 Network,表示您正在做一些网络访问的事情,而 Android 不喜欢这样。如果您添加更多代码,我们可以解决您的XY Problem -
@Knossos 我相信您的意思是您需要将网络代码移出 UI 线程。
-
糟糕!是的!网络代码需要移动到后台线程。
-
我想你不是原生的安卓开发者,但你应该熟悉restclients(比如Spring)。那么为什么不尝试使用retrofit/okhttp之类的东西呢?