2012-10-19 54 views
0

可能重複:
Android HttpClient : NetworkOnMainThreadExceptionAndroid應用客戶端採用Web服務

有麻煩林創建一個Android應用程序,它想成爲一個Web服務
我一個客戶端已經在java(eclipse)中創建。
這是很基本的,但它仍然無法正常工作..

Web服務類:

package com.ws; 

public class Converter { 

    public Converter() { 
    } 

    public String sayHello(String name) { 
     return "Hello " + name + "!"; 
    } 
} 

在Android應用程式類:(我用this教程爲)

package MyConverter.Android; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class access extends Activity { 

    private String METHOD_NAME = ""; 
    // our webservice method name 
    private String NAMESPACE = "http://ws.com"; 
    // Here package name in webservice with reverse order. 
    private String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
    // NAMESPACE + method name 
    // private static final String URL = 
    private static final String URL = "http://my-ip:8080/ConverterWebSrvice/services/Converter"; 

    // you must use ipaddress here, don’t use Hostname or localhost 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.access); 

     Button b2 = (Button) findViewById(R.id.button2); 
     b2.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){  
       ws(); 
      }}); 
     } 

    public void ws() { 
     String name = "Dan"; 

     METHOD_NAME = "sayHello"; 
     try { 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      request.addProperty("name", name); 
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      Object result = envelope.getResponse(); 
      ((TextView) findViewById(R.id.textView1)).setText(name 
        + " Longitude is : " + result.toString()); 

     } catch (Exception E) { 
      E.printStackTrace(); 
      ((TextView) findViewById(R.id.textView1)).setText("ERROR:" 
        + E.getClass().getName() + ":" + E.getMessage()); 
     } 
    } 
} 

我這是怎麼運行整個事情:
1.我「運行方式>在服務器上運行」的轉換器項目
2.我做「身份運行> android應用程序'爲應用程序項目

模擬器運行,當我按下按鈕我收到「不幸」的消息。
在logcat的(在Eclipse)我看到以下消息:

10-19 22:29:41.250: W/System.err(643): android.os.NetworkOnMainThreadException 
10-19 22:29:41.260: W/System.err(643): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
10-19 22:29:41.270: W/System.err(643): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
10-19 22:29:41.270: W/System.err(643): at libcore.io.IoBridge.connectErrno(IoBridge.java:144) 
10-19 22:29:41.270: W/System.err(643): at libcore.io.IoBridge.connect(IoBridge.java:112) 
10-19 22:29:41.270: W/System.err(643): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
10-19 22:29:41.280: W/System.err(643): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
10-19 22:29:41.280: W/System.err(643): at java.net.Socket.connect(Socket.java:842) 
10-19 22:29:41.290: W/System.err(643): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76) 
10-19 22:29:41.290: W/System.err(643): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
10-19 22:29:41.300: W/System.err(643): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341) 
10-19 22:29:41.300: W/System.err(643): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
10-19 22:29:41.300: W/System.err(643): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
10-19 22:29:41.300: W/System.err(643): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
10-19 22:29:41.310: W/System.err(643): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
10-19 22:29:41.310: W/System.err(643): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
10-19 22:29:41.320: W/System.err(643): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
10-19 22:29:41.320: W/System.err(643): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
10-19 22:29:41.320: W/System.err(643): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) 
10-19 22:29:41.330: W/System.err(643): at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:109) 
10-19 22:29:41.330: W/System.err(643): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:157) 
10-19 22:29:41.350: W/System.err(643): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96) 
10-19 22:29:41.350: W/System.err(643): at MyConverter.Android.access.ws(access.java:53) 
10-19 22:29:41.350: W/System.err(643): at MyConverter.Android.access$1.onClick(access.java:37) 
10-19 22:29:41.360: W/System.err(643): at android.view.View.performClick(View.java:4084) 
10-19 22:29:41.360: W/System.err(643): at android.view.View$PerformClick.run(View.java:16966) 
10-19 22:29:41.370: W/System.err(643): at android.os.Handler.handleCallback(Handler.java:615) 
10-19 22:29:41.380: W/System.err(643): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-19 22:29:41.390: W/System.err(643): at android.os.Looper.loop(Looper.java:137) 
10-19 22:29:41.390: W/System.err(643): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-19 22:29:41.402: W/System.err(643): at java.lang.reflect.Method.invokeNative(Native Method) 
10-19 22:29:41.402: W/System.err(643): at java.lang.reflect.Method.invoke(Method.java:511) 
10-19 22:29:41.410: W/System.err(643): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-19 22:29:41.410: W/System.err(643): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-19 22:29:41.410: W/System.err(643): at dalvik.system.NativeStart.main(Native Method) 
10-19 22:29:41.420: D/AndroidRuntime(643): Shutting down VM 
10-19 22:29:41.420: W/dalvikvm(643): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
10-19 22:29:41.450: E/AndroidRuntime(643): FATAL EXCEPTION: main 
10-19 22:29:41.450: E/AndroidRuntime(643): java.lang.NullPointerException 
10-19 22:29:41.450: E/AndroidRuntime(643): at MyConverter.Android.access.ws(access.java:60) 
10-19 22:29:41.450: E/AndroidRuntime(643): at MyConverter.Android.access$1.onClick(access.java:37) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.view.View.performClick(View.java:4084) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.view.View$PerformClick.run(View.java:16966) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.os.Handler.handleCallback(Handler.java:615) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.os.Looper.loop(Looper.java:137) 
10-19 22:29:41.450: E/AndroidRuntime(643): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-19 22:29:41.450: E/AndroidRuntime(643): at java.lang.reflect.Method.invokeNative(Native Method) 
10-19 22:29:41.450: E/AndroidRuntime(643): at java.lang.reflect.Method.invoke(Method.java:511) 
10-19 22:29:41.450: E/AndroidRuntime(643): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-19 22:29:41.450: E/AndroidRuntime(643): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-19 22:29:41.450: E/AndroidRuntime(643): at dalvik.system.NativeStart.main(Native Method) 
10-19 22:29:44.060: I/Process(643): Sending signal. PID: 643 SIG: 9 

任何幫助將不勝感激!

回答

0

你正在做的網絡訪問你的UI /主線程。開始查看Android的AsyncTask。對代碼進行了快速更新,以包含可能需要根據需要進行更新的AsyncTask。

public class LoginAcitivity extends Activity { 

    private String METHOD_NAME = ""; 
    // our webservice method name 
    private String NAMESPACE = "http://ws.com"; 
    // Here package name in webservice with reverse order. 
    private String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
    // NAMESPACE + method name 
    // private static final String URL = 
    private static final String URL = "http://my-ip:8080/ConverterWebSrvice/services/Converter"; 

    // you must use ipaddress here, don’t use Hostname or localhost 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.access); 

     Button b2 = (Button) findViewById(R.id.button2); 
     b2.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       AccessWebServiceTask task = new AccessWebServiceTask(); 
       task.execute(); 
      } 
     }); 
    } 

    public void ws() { 
     String name = "Dan"; 

     METHOD_NAME = "sayHello"; 
     try { 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      request.addProperty("name", name); 
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      Object result = envelope.getResponse(); 
      ((TextView) findViewById(R.id.textView1)).setText(name 
       + " Longitude is : " + result.toString()); 

     } catch (Exception E) { 
      E.printStackTrace(); 
      ((TextView) findViewById(R.id.textView1)).setText("ERROR:" 
       + E.getClass().getName() + ":" + E.getMessage()); 
     } 
    } 

    class AccessWebServiceTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      ws(); 
      return null; 
     } 

    } 

} 
+0

謝謝!它現在正在使用字符串,但是當我嘗試使用float時,例如,我得到:java.lang.RuntimeException:無法序列化:100.0。這是爲什麼? – user1692261