android.os.NetworkOnMainThreadException

android.os.NetworkOnMainThreadException这个异常

也就是说不能在主线程中执行网络操作


解决方案:

①,

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork() 
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
这个因为api冲突没有解决,试了第二种方法,比较好使

②,使用线程执行下载任务

  class DownloadTxtListener implements OnClickListener {
public void onClick(View v) {
new Thread(downloadRun).start();
}
}


Thread downloadRun = new Thread() {
@Override
public void run() {
down();
}


};


private void down(){
HttpDownloader httpDownloader = new HttpDownloader();
String lrc = httpDownloader.download("http://www.baidu.com");
}

来自;

给 Android 应用开发者的十个建议:

 

 2)让阻塞操作远离主 UI 线程

  通过使用 AsyncTask、线程、IntentService 和自定义后台服务,保证应用的灵活性。使用加载工具简化游标等长时间加载数据的状态管理。当有其他程序运行时,不能让你的应用滞后或中止。

  如果一个操作需要消耗较多时间和资源时,取消该操作,换成异步处理,这样应用就能保持响应,用户可以继续各种操作。该方法适用磁盘读写、访问内容提供方、数据库和互联网,以及解析和其他需要花费较长时间的任务。

  3)使用最新的 Android SDK 版本和 API

  使用 Android 平台的最新产品,保证你的应用紧跟 Android 的更新步伐。随着 Android 平台的不断发展,部分功能可能被弃用或被更好的功能取代,核心 API 接收了 bug 修复和性能改进,新 API 有助于开发者编写出更稳定的应用。要明白最佳的做法总是随着时间的推移而变,聪明的开发者应该总是站在整个平台的最前沿。

4)考虑使用 StrictMode

  从 Android 2.3 开始提供了一个新的类 StrictMode,该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者改进程序,使主线程处理 UI 和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞。

 5)发布前禁用或尽量减少调试

  如果开发周期较长,你很可能在应用中内置了一些日志或调试代码,在发布前确保这些功能已经最小化或完全禁用。

  6)确保 UI 布局简单优雅

  简单的屏幕不仅方便阅读,还能加快加载速度。与其在一个单一屏幕上堆砌太多不必要的功能,不如花时间去开发优雅的用户界面。简单优雅的 UI 不仅能提高应用性能,还能提高用户使用该应用时的效率。

9)使用 layoutopt 进行布局优化

  Layoutopt 是一款简单的命令行工具,可帮助找到不必要的控件嵌套以及缩减布局资源,从而使应用变得可能“苗条”。控件越少、布局层次越浅,性能就越好。




你可能感兴趣的:(android.os.NetworkOnMainThreadException)