NetworkOnMainThreadException

我刚刚在官方文档中发现了NetworkOnMainThreadException

并想知道模拟器是否正在抛出这个。 我一直在testing我的应用程序,据我所知,所有的networking都脱离主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否没有逃脱。

我也使用StrictMode并没有看到任何东西。

  1. 我的代码是干净的,还是不会在模拟器上抛出?

  2. 我们应该如何准备在生产中发生这种情况呢?

  3. 宽限期或什么? 或者现在已经过去了;-) ??

有了蜂窝,就不能像文档中所说的那样在其主线程上执行联网操作。 出于这个原因,你必须使用处理程序或asynctask。 没有其他办法可以做到这一点。

在这里你可以find2土耳其关于networking操作写的例子。 也许他们帮助。

  • 3.党kütüphanekullanmadan(ksoap2) ,(它包括英文翻译)

  • AsyncTask class'tandönenparametreyi handle etmek。 , 谷歌翻译

我已经testing了这个,事实上它也发生在模拟器上。 如果你打算把它放到3.0以上的平板电脑上,那么最好确保你至less在模拟器上testing你的应用程序。

如果你运行在3.0,我不能帮助; 由于严格模式默认打开, 但是它的上面,那么这可能会有所帮助

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 

在你的HTTP连接创build之前join这个; 然后它工作

在main方法内执行某些联网操作时,发生NetworkOnMainThreadException ; 我的意思是Oncreate() 。 你可以使用AsyncTask来解决这个问题。 或者你可以使用

 StrictMode.ThreadPolicy mypolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 

里面的onCreate()方法。

从Honeycomb SDK(3)中,Google将不再允许networking请求(HTTP,Socket)和其他相关操作直接在Main Thread类中进行,实际上,不应该在UI线程中直接进行networking操作,阻止UI,用户体验是坏! 即使Google不被禁止,一般情况下我们也不会这样做! 那么,就是在Honeycomb SDK(3)版本中,你也可以在Main Thread中继续这样做,超过3个,这样就行不通了。

1.使用Handler

与networking相关的更耗时的操作被放置到子线程中,然后使用Handler消息机制与主线程通信

 public static final String TAG = "NetWorkException"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_net_work_exception); // Opens a child thread, performs network operations, waits for a return result, and uses handler to notify UI new Thread(networkTask).start(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // get data from msg and notify UI Bundle data = msg.getData(); String val = data.getString("data"); Log.i(TAG, "the result-->" + val); } }; /** * net work task */ Runnable networkTask = new Runnable() { @Override public void run() { // do here, the HTTP request. network requests related operations Message msg = new Message(); Bundle data = new Bundle(); data.putString("data", "request"); msg.setData(data); handler.sendMessage(msg); } }; 

2.使用AsyncTask

 public static final String TAG = "NetWorkException"; private ImageView mImageView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_net_work_exception); mImageView = findViewById(R.id.image_view); new DownImage(mImageView).execute(); } class DownImage extends AsyncTask<String, Integer, Bitmap> { private ImageView imageView; public DownImage(ImageView imageView) { this.imageView = imageView; } @Override protected Bitmap doInBackground(String... params) { String url = params[0]; Bitmap bitmap = null; try { //load image from internet , http request here InputStream is = new URL(url).openStream(); bitmap = BitmapFactory.decodeStream(is); } catch (Exception e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { // nodify UI here imageView.setImageBitmap(result); } } 

3.使用StrictMode

 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }