NetworkOnMainThreadException
我刚刚在官方文档中发现了NetworkOnMainThreadException
并想知道模拟器是否正在抛出这个。 我一直在testing我的应用程序,据我所知,所有的networking都脱离主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否没有逃脱。
我也使用StrictMode并没有看到任何东西。
-
我的代码是干净的,还是不会在模拟器上抛出?
-
我们应该如何准备在生产中发生这种情况呢?
-
宽限期或什么? 或者现在已经过去了;-) ??
有了蜂窝,就不能像文档中所说的那样在其主线程上执行联网操作。 出于这个原因,你必须使用处理程序或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); }