如何修复异常:发送结果ResultInfo失败
如何修复异常:发送结果ResultInfo失败
我有一个应用程序,在对话框中显示一个列表视图。用户从列表视图中选择一个选项后,我将使用用户选择的信息来更改记录。\n为此,我考虑使用命令setResult(RESULT_OK,intent);
但是我的代码生成了以下异常:\n
09-25 12:01:06.035:E / AndroidRuntime(8783):致命异常:主线程上的网络异常 09-25 12:01:06.035:E / AndroidRuntime(8783):java.lang.RuntimeException:发送结果失败ResultInfo{who = null,request = 0,result = -1,data = Intent {flg = 0x20000000 cmp = com.sisteplantbrasil / .WorkOrderInfo(有附加参数)}}}到activity {com.sisteplantbrasil / com.sisteplantbrasil.WorkOrderInfo}:android.os.NetworkOnMainThreadException 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread.deliverResults(ActivityThread.java:3182)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread.handleSendResult(ActivityThread.java:3225)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread.access $ 1100(ActivityThread.java:140)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1275)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.os.Handler.dispatchMessage(Handler.java:99)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.os.Looper.loop(Looper.java:137)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread.main(ActivityThread.java:4898)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在java.lang.reflect.Method.invokeNative(Native Method)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在java.lang.reflect.Method.invoke(Method.java:511)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1006)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在dalvik.system.NativeStart.main(Native Method)中 09-25 12:01:06.035:E / AndroidRuntime(8783):造成原因:android.os.NetworkOnMainThreadException 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.io.IoBridge.connectErrno(IoBridge.java:144)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.io.IoBridge.connect(IoBridge.java:112)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在java.net.Socket.connect(Socket.java:842)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpConnection.(HttpConnection.java:76)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpConnection. (HttpConnection.java:50)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpConnection $ Address.connect(HttpConnection.java:340)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpConnection.connect(HttpConnection.java:128)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpEngine.connect(HttpEngine.java:310)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:146)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.webservices.PrismaWebServices.getDateTimeNow(PrismaWebServices.java:144)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.entities.LaborRecord.getCurrentDate(LaborRecord.java:120)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.entities.LaborRecord.getLaborEndDate(LaborRecord.java:146)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.queries.sql.LaborRecordDBQueries.insertLaborRecord(LaborRecordDBQueries.java:35)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.entities.LaborRecord.offlineSave(LaborRecord.java:167)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在com.sisteplantbrasil.WorkOrderInfo.onActivityResult(WorkOrderInfo.java:492)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.Activity.dispatchActivityResult(Activity.java:5390)中 09-25 12:01:06.035:E / AndroidRuntime(8783):在android.app.ActivityThread.deliverResults(ActivityThread.java:3178)中 09-25 12:01:06.035:E / AndroidRuntime(8783):... 11更多
\n我的代码:\n
public void onClickEndLabor(View v){ if(selectedNextWorkOrderState!= null){ 意图意图; if(showNotes){ EditText txtNotes =(EditText)findViewById(R.id.txtNotes); intent = IntentFactory.createWorkOrderInfo( WorkOrderStateWorkflow.this, selectedNextWorkOrderState,txtNotes.getText() .toString(),Intent.FLAG_ACTIVITY_SINGLE_TOP); } else { intent = IntentFactory.createWorkOrderInfo( WorkOrderStateWorkflow.this, selectedNextWorkOrderState,"", Intent.FLAG_ACTIVITY_SINGLE_TOP); } setResult(RESULT_OK,intent); finish(); } }
\n工作订单信息活动:\n
protected void onActivityResult(int requestCode,int resultCode, 意图意图){ if(resultCode == RESULT_OK){ super.onActivityResult(requestCode,resultCode,intent); Bundle extras = intent.getExtras(); if(extras!= null){ WorkOrderState nextWOState =(WorkOrderState)extras .getSerializable("workOrderState"); nextState = nextWOState.getWorkOrderState(); String notes = extras.getString("notes"); WorkOrder workOrder = Application.getInstance()。getWorkOrder(); previousWOState = new WorkOrderState( workOrder.getWorkOrderState(), workOrder.getWorkOrderStateName()); if(Application.getInstance()。useLaborRecord()){ lre.setWorkOrder(workOrder); lre.setNotes(notes); progress = ProgressDialog.show(this,getResources() .getString(R.string.Wait),getResources() .getString(R.string.EndingLabor)); if(Application.getInstance()。getStatus()== AppStatus.ONLINE){ lre.asyncSave(endHandler); lre.getWorkOrder()。offlineSave(false); lre.offlineSave(false,false); } else { if(lre.offlineSave(true,false) && lre.getWorkOrder()。offlineSave(false)){ endHandler.sendEmptyMessage(0); } else { Message msg = new Message(); msg.obj = new QueryException(getResources() .getString(R.string.ErrorSaving)); endHandler.sendMessage(msg); } } } else { ChangeWOState changeState = new ChangeWOState( WorkOrderInfo.this); changeState.execute(); } } } }
\n有人能告诉我代码有什么问题吗?\n谢谢您的关注!
在Android开发中,当应用程序在主线程上执行网络操作时,会抛出NetworkOnMainThreadException异常。这是因为在Android平台上,主线程主要用于处理用户界面的更新和响应事件,如果在主线程上执行耗时的网络操作,就会导致界面冻结和响应延迟。
为了解决这个问题,可以使用AsyncTask来在后台线程上执行网络操作。AsyncTask是Android提供的一个简单易用的类,用于在后台执行任务并在主线程上更新UI。下面是一些有关AsyncTask的链接:
- http://android-developers.blogspot.in/2009/05/painless-threading.html
- http://developer.android.com/reference/android/os/AsyncTask.html
- android.os.NetworkOnMainThreadException with android 4.2
- http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
- http://blog.vogella.com/2012/02/22/android-strictmode-networkonmainthreadexception/
如果遇到Exception: Failure delivering result ResultInfo的问题,可以参考上述链接中的内容,并将代码放在AsyncTask的doInBackground方法中执行。这样可以确保网络操作在后台线程上执行,避免在主线程上执行耗时操作导致的异常。