gpt4 book ai didi

java - Web 服务的 android.os.NetworkOnMainThreadException (ksoap)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:40 26 4
gpt4 key购买 nike

我是 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 客户端之一。

关于java - Web 服务的 android.os.NetworkOnMainThreadException (ksoap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com