Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 作为线程启动活动?_Java_Android - Fatal编程技术网

Java 作为线程启动活动?

Java 作为线程启动活动?,java,android,Java,Android,我目前正在努力创建我最近编写的“战舰”程序的移动(Android)版本。虽然我的GUI现在已经完成,程序的大部分部分应该可以工作了,但我(至少)还有一个主要问题:除了服务器部分(将对用户输入等做出反应)之外,程序的主要部分依赖于Java NIO,即网络访问。但是,由于它在主线程上运行,我收到 java.lang.RuntimeException: Unable to start activity ComponentInfo{x.battleship/x.battleship.Battleship

我目前正在努力创建我最近编写的“战舰”程序的移动(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%哑的。当使用意图创建新活动时,我创建了意图,启动了它,然后使用intentname.putExtra(key,value)——这显然不起作用。现在,我遇到了另一个错误,因为我试图从另一个线程更改复选框,但是网络部分工作了,所以我想我很快就会完成。

您遇到的问题是您在主线程上进行网络连接,这是禁止的。将所有网络和网络/api调用移动到
AsyncTask
s中,应该可以继续了

编辑: 除此之外,请放弃将活动作为线程启动的想法,因为活动有自己的生命周期


EDIT2:也许如果你关闭了StrictMode(开发者选项中提供),你可以在主线程上联网,但是。。。我不会指望的。

你不能。您只有一个UI线程。

您不能在非UI线程上运行活动。您需要将网络代码移动到UI线程上。活动中的网络代码。关键字是NetworkOnMainThreadException中的network,意思是你正在做一些网络访问的事情,Android不喜欢这样。如果您添加更多代码,我们可以解决您的@Knossos问题。我相信您的意思是您需要将网络代码从UI线程中移出。哎呀!对网络代码需要转移到后台线程。我想你不是本地android开发人员,但你应该熟悉RESTClient(如Spring)。因此,为什么不尝试在主线程上使用改型/okhttp?
联网?
请忘记这些词,永远不要再说它们。我感谢你的担心,@Droidman,但我可以向你保证,我无意使用任何“黑客”,因此我不必将我的网络转移到单独的线程。a) 这可能比实际移动网络部分需要更多的工作,而且b)因为我现在知道我不允许在主线程上做网络工作,所以我以后不会以这种方式构建我的程序。除此之外,我还想知道为什么使用这些黑客会很糟糕——我想谷歌之所以禁用它是有原因的,对吧?在主线程上联网被认为是不好的做法,因为这会导致糟糕的用户界面体验。主线程也称为UI线程,因为用户界面是由该线程驱动的。如果在主线程上执行长时间运行的操作,则会阻止系统对UI进行更新,从而导致应用程序冻结,直到操作结束。因此,您可以在主线程上执行短操作,但不能执行长操作,如可能需要几秒钟甚至几分钟的联网操作。要量化主线程上的短操作和长操作:长操作大致是任何需要超过10或15毫秒的操作。当屏幕以每秒60帧的速度刷新时,可获得流畅的用户界面体验。这意味着每帧有16毫秒的时间(1秒除以60帧)。如果你用尽了所有的时间来绘制一个框架,那么系统将不得不跳过该框架。用户会注意到屏幕抖动。顺便说一句,持续5秒以上的UI阻塞操作会导致错误。这些应该像瘟疫一样避免。这就是Google引入NetworkingOnMainThreadException(在API级别11中)的原因。这太糟糕了,他们强迫应用程序崩溃,而不是让坏代码进入应用程序。