我正在尝试开发一个Android应用程序,它首先连接到我的Web实例并获取启动信息,然后根据该信息启动我的应用程序。
我试图在我的onCreate方法中编写URL连接代码,但是当我运行应用程序时,它会抛出NetworkOnMainThreadException。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StartUp startUp = new StartUp(); // StartUp() constructor has URL Connection codes and this line throws exception
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(startUp.getFirstLoadUrl());
mWebView.setWebViewClient(new WebViewHandler());
}
我不应该使用线程,因为我的onCreate方法中的其他代码必须等待URL连接的输出。
我该怎么做?
答案 0 :(得分:2)
您需要的是AsyncTask,您可以使用onCreate
方法开始,该方法在后台进行网络通信(doInBackground
方法)。当任务正在运行时,您可以显示某种进度对话框(或活动中的视图),让用户知道正在发生的事情以及他需要等待的事情。同时,此对话框阻止他在您的应用程序中执行某些操作(例如,需要从服务器获取一些数据)。
为了在任务完成后继续执行代码,您需要覆盖/实现它的onPostExecute
方法,以了解何时可以继续执行。
答案 1 :(得分:1)
使用AsyncTask
,在doInBackground()
中执行网络I / O,然后将[您的onCreate方法中的其他代码“移至onPostExecute()
的{{1}} 。
答案 2 :(得分:1)
从4.0开始,您无法在主线程上执行网络操作,因此您应该考虑AsyncTask或Thread