如何修复异常:发送结果ResultInfo失败

9 浏览
0 Comments

如何修复异常:发送结果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谢谢您的关注!

0
0 Comments

在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方法中执行。这样可以确保网络操作在后台线程上执行,避免在主线程上执行耗时操作导致的异常。

0