我是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)
那么问题是什么呢?
答案 0 :(得分:19)
您无法在主线程上执行网络操作。 结帐:http://developer.android.com/reference/android/os/AsyncTask.html
用于无痛背景穿线:)
编辑:因为即使它已经好几年了,我仍然会对这个答案进行投票,但我不再建议使用AsyncTask。它有许多已知的问题(http://blog.danlew.net/2014/06/21/the-hidden-pitfalls-of-asynctask/)。相反,我会敦促你使用Retrofit或其他一个很好的http客户端,为你处理线程。
答案 1 :(得分:11)
完整示例:
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private String TAG ="Vik";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncCallWS task = new AsyncCallWS();
task.execute();
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, "doInBackground");
calculate();
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i(TAG, "onPostExecute");
}
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
}
@Override
protected void onProgressUpdate(Void... values) {
Log.i(TAG, "onProgressUpdate");
}
}
public void calculate()
{
String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
String METHOD_NAME = "CelsiusToFahrenheit";
String NAMESPACE = "http://tempuri.org/";
String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
try {
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("Celsius", "32");
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
HttpTransportSE transport= new HttpTransportSE(URL);
transport.call(SOAP_ACTION, soapEnvelope);
SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
Log.i(TAG, "Result Celsius: " + resultString);
}
catch(Exception ex) {
Log.e(TAG, "Error: " + ex.getMessage());
}
SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
METHOD_NAME = "FahrenheitToCelsius";
try {
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("Fahrenheit", "100");
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
HttpTransportSE transport= new HttpTransportSE(URL);
transport.call(SOAP_ACTION, soapEnvelope);
SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
Log.i(TAG, "Result Fahrenheit: " + resultString);
}
catch(Exception ex) {
Log.e(TAG, "Error: " + ex.getMessage());
}
}
}
答案 2 :(得分:4)
尝试将strictmode添加到您的应用程序中。在onCreate方法中,添加
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);