2011-12-30 20 views
0

私は、Webサービスからデータを読み込むためにWebサービスを使用するアンドロイドでクラスを作成しました。androidクラスからwebserviceを呼び出す際にエラーが発生しました

URL呼び出しでそのWebサービスにアクセスするとき、その応答XMLを正しく取得しています。私はhttp://localhost:8083/TestWebService/services/GetDatabaseRecords?wsdlのような私のローカルサーバと私のURLにwebserviceを配備しました。

私のアプリでWebサービスを使用するコード部分は次のとおりです。

private String METHOD_NAME = "getSupplierDetails"; // our webservice method name 
private String NAMESPACE = "http://test.webservice.com/"; // Here package name in webservice with reverse order. 
private String SOAP_ACTION = NAMESPACE + METHOD_NAME; // NAMESPACE + method name 
private static final String URL = "http://my-machine-ip:8083/TestWebService/services/GetDatabaseRecords?wsdl"; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     androidHttpTransport.debug = true; 
     androidHttpTransport.call(SOAP_ACTION,envelope); 
     SoapObject so = (SoapObject)envelope.bodyIn; 

以下は、アプリケーションの実行時の例外です。

android.os.NetworkOnMainThreadException:null 

私のコードに問題がありますか?専門家が助けてください。

+1

あなたはUIスレッドでHTTPを実行しようとしています。 AsyncTaskまたは他の構造を使用して、メインスレッドから外してください。うまくいくでしょう。 – Jens

答えて

2

例外として、メイン(UI)スレッドからネットワーク(潜在的に遅いブロッキングリソース)を使用しようとしています。 Androidではこれができません。別のスレッドでネットワークアクセスを実行して、UIを応答可能に保つ必要があります。

詳細は"Designing for Responsiveness"ガイダンスを参照してください。

+0

はい、AndroidはUIスレッドでネットワーク操作を実行することはできませんが、3.0以降です。 –

+0

私はonCreateメソッドでこのコード部分を作成しました。 –

0

Androidでこれらの種類のタスクにバックグラウンドスレッドを使用する必要があります。率直に言って、Androidはあなたがしようとしているものとまったく同じAsyncTask型を提供しています。ような何か:

private class WebserviceTask extends AsyncTask<String, Void, Object> { 
protected void doInBackground(String... parameters) { 
    //do web service things here 
    return result; //This is the parameter of onPostExecute, change type accordingly 
} 

protected void onPostExecute(Object result) { 
    //do something with the result 
} 
} 

使用法:

WebserviceTask task = new WebserviceTask(); 
task.execute("http://www.example.com/api"); //You can pass the parameters like this 

いけないだけでなく、あなたのマニフェストに

<uses-permission android:name="android.permission.INTERNET" /> 

行を追加するのを忘れ。

希望します。

関連する問題