当前位置: 首页 > 面试题库 >

适用于Web服务的android.os.NetworkOnMainThreadException(ksoap)

陆宇航
2023-03-14
问题内容

我是android编程的新手,并尝试在此示例程序中使用webservice:

我使用Android 4.1,而我的IDE是Eclipse Juno。我认为编程部分还可以,但是可能存在连接问题。

package com.example.webserviceexample;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    final static String NAMESPACE = "http://tempuri.org/";
    final static String METHOD_NAME = "CelsiusToFahrenheit";
    final static String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
    final static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

    TextView sonuc;
    EditText deger;
    Button hesapla;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        deger = (EditText) findViewById(R.id.deger);
        sonuc = (TextView) findViewById(R.id.flag);
        hesapla = (Button) findViewById(R.id.hesapla);

        hesapla.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                //request info
                SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
                Request.addProperty("Celcius",deger.getText().toString());

                //envelope
                SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                soapEnvelope.dotNet = true; //.NET = true, php = false

                //putting request to the envelope
                soapEnvelope.setOutputSoapObject(Request);

                //transferring data
                HttpTransportSE aht = new HttpTransportSE(URL); //prepare
                //start
                try {
                        aht.call(SOAP_ACTION, soapEnvelope);
                } 
                catch (IOException e) {
                    e.printStackTrace();
                }
                catch (XmlPullParserException e)
                {
                    e.printStackTrace();
                }

                //waiting and getting response.
                String result;

                try {
                    // we are creating SoapPrimitive Object as waiting for simple variable.
                    result = "Fahrenheit:" + soapEnvelope.getResponse();

                    //writing the result to the textView
                    sonuc.setText(result);
                }
                catch (SoapFault e) {
                    e.printStackTrace();
                }

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

但是,我收到此错误:

08-15 11:45:26.294: E/AndroidRuntime(641): FATAL EXCEPTION: main
08-15 11:45:26.294: E/AndroidRuntime(641): android.os.NetworkOnMainThreadException
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:146)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.example.webserviceexample.MainActivity$1.onClick(MainActivity.java:61)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.view.View.performClick(View.java:4084)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.view.View$PerformClick.run(View.java:16966)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Handler.handleCallback(Handler.java:615)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Looper.loop(Looper.java:137)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.app.ActivityThread.main(ActivityThread.java:4745)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.lang.reflect.Method.invokeNative(Native Method)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.lang.reflect.Method.invoke(Method.java:511)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-15 11:45:26.294: E/AndroidRuntime(641):  at dalvik.system.NativeStart.main(Native Method)

那么可能是什么问题呢?


问题答案:

您不能在主线程上执行网络操作。结帐:http
:
//developer.android.com/reference/android/os/AsyncTask.html

用于无痛的后台线程:)

编辑:由于即使这个答案已经有好几年了,我仍然对此答案有投票权,所以我不再建议使用AsyncTask。它具有许多已知问题,在此处进行了描述(http://blog.danlew.net/2014/06/21/the-
hidden-pitfalls-of-asynctask/
)。相反,我建议您使用Retrofit或其他可以为您处理线程的不错的http客户端之一。



 类似资料:
  • 我正试图用glassFish 4.1.1和非常简单的HelloWorld服务在IntelliJ上开发一个RESTful服务,但我不明白为什么它不起作用。根据他们的教程,我根据需要配置了IntelliJ IDEA- https://www.jetbrains.com/help/idea/creating-and-running-your-first-restful-web-service.html#

  • 我在laravel开发了一个网站,并上传到网络服务器。我将所有文件和文件夹上传到根目录和公共文件夹的文件public_html。现在,当我键入网址到我的浏览器的主页工作正常,但我的其他路线显示 在laravel文档中,我发现“存储和引导/缓存目录中的目录应该可以由web服务器写入,否则laravel将无法运行。” 这是原因吗。如果是,那么我该怎么做?

  • 问题内容: 嗨,我正在用React钩子编程一个页面,并且试图将从服务器获取的数据设置为状态。怎么它不起作用。我从服务器获取数据,但无法将其映射到状态。任何想法可能是什么问题? 来自服务器的数据 问题答案: 是async方法,因此您将无法在其下获取更新的数据。 否则您的代码是好的,如果您循环并显示它,它将反映在DOM中 运行下面的代码片段,并检查HTML和console两者,这将清除流程。

  • 有人能回答我的困境,使用哪种方法将Android设备连接到mySQL或PostgreSQL? 我可以用这两种方式来做,没有任何错误和问题,没有明显的区别,但每个人都建议使用web服务而不是使用jdbc驱动程序和直接连接,

  • 我试图用ssl证书加载一个web服务,它说是服务器启动,但当我试图使用这个web服务(通过SOAPUI)时,我得到了“SSLHandShakeException”,在eclipse上日志中我看到以下内容: SSLV2无可用密码套件Hello无可用密码套件SSLv3无可用密码套件TLSv1无可用密码套件TLSv1.1无可用密码套件TLSv1.2 qtp1589240253-57,致命错误:80:问题

  • react中的前端 基于Spring Boot“resource-service”的后端服务 keycloak 其他后端服务(使用者) 前端和使用者服务都使用REST API与后端通信。我们使用Keycloak作为我们的用户管理和身份验证服务。 我们希望通过提供web应用程序和服务流来将基于Spring的服务“资源服务”与Keycloak集成: > 基于web application-react的