2017-03-14 2 views
0

So habe ich ein Problem mit der Verbindung mit dem Webservice w3schools.I versuchen, ein Gefühl für die Implementierung von Webservices mit der KSOAP2-Bibliothek in Android Studio zu bekommen.Ich habe einen Wert hart geschrieben, um zurückzukehren etwas, sobald der Bildschirm geladen wird, aber ich denke nicht, dass ich den Webservice treffe. Bitte assistieren.Android mit ksoap2 zum Verbinden mit Webservice fehlgeschlagen

Die Manifestdatei >

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> 
     <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.mjivan.webservicestut" > 

      <application 

       android:allowBackup="true" 
       android:icon="@mipmap/ic_launcher" 
       android:label="@string/app_name" 

       android:supportsRtl="true" 
       android:theme="@style/AppTheme" > 
       <activity android:name=".MainActivity" > 
        <intent-filter> 
         <action android:name="android.intent.action.MAIN" /> 

         <category android:name="android.intent.category.LAUNCHER" /> 
        </intent-filter> 
       </activity> 
      </application> 
      <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
     </manifest> 

MainActivity.java

 package com.example.mjivan.webservicestut; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.AndroidHttpTransport; 
import org.ksoap2.transport.HttpTransportSE; 

public class MainActivity extends Activity { 

    private TextView txt; 
    private String celsius; 
    private static final String SOAP_ACTION = "https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit"; 
    private static final String METHOD_NAME = "CelsiusToFahrenheit"; 
    private static final String NAMESPACE = "https://www.w3schools.com/"; 
    private static final String URL = "https://www.w3schools.com/xml/tempconvert.asmx"; 

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


     final EditText edt = (EditText) findViewById(R.id.value_to_convert); 
     Button btn = (Button) findViewById(R.id.convert); 
     txt = (TextView) findViewById(R.id.answer); 
    } 

     private class LongOperation extends AsyncTask<String, Void,String> { 

      @Override 
      protected String doInBackground(String... params) { 
       SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
       Request.addProperty("Celsius", "32"); 


       SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       soapEnvelope.dotNet = true; 
       soapEnvelope.setOutputSoapObject(Request); 

       HttpTransportSE aht = new HttpTransportSE(URL); 
       try { 
        aht.call(SOAP_ACTION, soapEnvelope); 
        SoapPrimitive resultString = (SoapPrimitive) soapEnvelope.getResponse(); 
        return "" + resultString; 
        //txt.setText("Status :" + resultString); 
       } catch (Exception e) { 

        return null; 
       } 
      } 
       @Override 
       protected void onPostExecute (String result) 
       { 
        TextView txt = (TextView) findViewById(R.id.answer); 
        txt.setText(result); // txt.setText(result); 
        // might want to change "executed" for the returned string passed 
        // into onPostExecute() but that is upto you 
       } 

       @Override 
       protected void onPreExecute() 
       { 

       } 


       @Override 
       protected void onProgressUpdate (Void...values) 
       { 

       } 

     } 



} 

activity_main.xml

//layout file 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 


     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/value_to_convert" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Convert" 
      android:id="@+id/convert" 
      android:layout_gravity="center_horizontal" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/answer" 
      android:textColor="@color/background_floating_material_dark" /> 
    </LinearLayout> 

Logcat

 03-14 11:47:41.051 15992-15992/com.example.mjivan.webservicestut I/InjectionManager: Inside getClassLibPath caller 
03-14 11:47:41.051 15992-15992/com.example.mjivan.webservicestut W/System: ClassLoader referenced unknown path: /data/app/com.example.mjivan.webservicestut-1/lib/arm64 
03-14 11:47:41.061 15992-15992/com.example.mjivan.webservicestut W/ResourcesManager: getTopLevelResources: /data/app/com.example.mjivan.webservicestut-1/base.apk/1.0 running in com.example.mjivan.webservicestut rsrc of package com.example.mjivan.webservicestut 
03-14 11:47:41.061 15992-15992/com.example.mjivan.webservicestut I/InjectionManager: Inside getClassLibPath + mLibMap{0=, 1=} 
03-14 11:47:41.061 15992-15992/com.example.mjivan.webservicestut D/ResourcesManager: For user 0 new overlays fetched Null 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut W/System: ClassLoader referenced unknown path: /data/app/com.example.mjivan.webservicestut-1/lib/arm64 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.191 15992-15992/com.example.mjivan.webservicestut D/Minikin: FontFamily bestFont == NULL, so return vacant FakedFont 
03-14 11:47:43.201 15992-15992/com.example.mjivan.webservicestut D/InjectionManager: InjectionManager 
03-14 11:47:43.201 15992-15992/com.example.mjivan.webservicestut D/InjectionManager: fillFeatureStoreMap com.example.mjivan.webservicestut 
03-14 11:47:43.201 15992-15992/com.example.mjivan.webservicestut I/InjectionManager: Constructor com.example.mjivan.webservicestut, Feature store :{} 
03-14 11:47:43.201 15992-15992/com.example.mjivan.webservicestut I/InjectionManager: featureStore :{} 
03-14 11:47:43.211 15992-15992/com.example.mjivan.webservicestut W/ResourcesManager: getTopLevelResources: /data/app/com.example.mjivan.webservicestut-1/base.apk/1.0 running in com.example.mjivan.webservicestut rsrc of package com.example.mjivan.webservicestut 
03-14 11:47:43.211 15992-15992/com.example.mjivan.webservicestut W/ResourcesManager: getTopLevelResources: /data/app/com.example.mjivan.webservicestut-1/base.apk/1.0 running in com.example.mjivan.webservicestut rsrc of package com.example.mjivan.webservicestut 
03-14 11:47:43.251 15992-15992/com.example.mjivan.webservicestut D/ClipboardExManager: no knox 
03-14 11:47:43.261 15992-15992/com.example.mjivan.webservicestut D/Activity: performCreate Call Injection manager 
03-14 11:47:43.261 15992-15992/com.example.mjivan.webservicestut I/InjectionManager: dispatchOnViewCreated > Target : com.example.mjivan.webservicestut.MainActivity isFragment :false 
03-14 11:47:43.271 15992-15992/com.example.mjivan.webservicestut D/SecWifiDisplayUtil: Metadata value : SecSettings2 
03-14 11:47:43.271 15992-15992/com.example.mjivan.webservicestut D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorView{b756f4e I.E...... R.....ID 0,0-0,0} 
03-14 11:47:43.271 15992-16417/com.example.mjivan.webservicestut D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
03-14 11:47:43.351 15992-16417/com.example.mjivan.webservicestut D/libEGL: loaded /vendor/lib64/egl/libGLES_mali.so 
03-14 11:47:43.361 15992-16417/com.example.mjivan.webservicestut D/libEGL: eglInitialize EGLDisplay = 0x7f990ff178 
03-14 11:47:43.361 15992-16417/com.example.mjivan.webservicestut I/OpenGLRenderer: Initialized EGL, version 1.4 

                        [ 03-14 11:47:43.371 15992:16417 D/   ] 
                        ro.exynos.dss isEnabled: 0 
03-14 11:47:43.371 15992-16417/com.example.mjivan.webservicestut D/mali_winsys: new_window_surface returns 0x3000, [1440x2560]-format:1 
03-14 11:47:43.391 15992-15992/com.example.mjivan.webservicestut W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView) 
03-14 11:47:43.391 15992-15992/com.example.mjivan.webservicestut W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView) 
03-14 11:47:43.391 15992-16417/com.example.mjivan.webservicestut D/libGLESv1: DTS_GLAPI : DTS is not allowed for Package : com.example.mjivan.webservicestut 
03-14 11:47:43.481 15992-15992/com.example.mjivan.webservicestut D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1 
03-14 11:47:43.501 15992-15992/com.example.mjivan.webservicestut I/Timeline: Timeline: Activity_idle id: [email protected] time:30405778 
+0

Mögliche duplicate of [Wie zu beheben android.os.NetworkOnMainThreadException?] (Http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception) – Yazan

Antwort

0

in Ihrem Code wurde nicht jedem Thread oder AsyncTask ausführen Ihre Network Operation verwendet haben. das ist, warum Sie haben Fehler bekommen NetworkOnMainThreadException

Ihrerseits von Code hinzufügen i setzen unten in AsyncTask

private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
       Request.addProperty("Celsius", "32"); 


       SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       soapEnvelope.dotNet = true; 
       soapEnvelope.setOutputSoapObject(Request); 

       HttpTransportSE aht = new HttpTransportSE(URL); 
       try { 
        aht.call(SOAP_ACTION, soapEnvelope); 
        SoapPrimitive resultString = (SoapPrimitive) soapEnvelope.getResponse(); 
      return ""+resultString; 
        txt.setText("Status :" + resultString); 
       } catch (Excep 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      TextView txt = (TextView) findViewById(R.id.output); 
      txt.setText("Executed"); // txt.setText(result); 
      // might want to change "executed" for the returned string passed 
      // into onPostExecute() but that is upto you 
     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 

AsyncTask nutzen zu können, es muss eine Unterklasse. AsyncTask verwendet Generika und Varargs. Die Parameter sind folgende .

Eine AsyncTask wird über die Methode execute() gestartet. Diese execute() -Methode ruft die Methode doInBackground() und onPostExecute() auf.

TypeOfVarArgParams wird in die Methode doInBackground() als Eingabe übergeben. ProgressValue wird für Fortschrittsinformationen verwendet und ResultValue muss von doInBackground() Methode zurückgegeben werden. Dieser Parameter wird als Parameter an onPostExecute() übergeben.

Die Methode doInBackground() enthält die Codierungsanweisung, die in einem Hintergrundthread ausgeführt werden sollte. Diese Methode wird automatisch in einem separaten Thread ausgeführt.

Die Methode onPostExecute() synchronisiert sich erneut mit dem Thread der Benutzerschnittstelle und ermöglicht die Aktualisierung. Diese Methode wird vom Framework aufgerufen, sobald die Methode doInBackground() abgeschlossen ist.

+0

Ich bin nicht sehr vertraut mit der Umgebung async auf diese Weise, habe ich die obige Aktivität geändert, lass mich wissen, was ich ändern soll. –

+0

@MileshJivan sehe meine Update-Antwort. –

+0

in der Zeile txt.setText ("Status:" + resultString); Ich erhalte einen Fehler, der besagt, dass die Methode setText von UI-Thread aufgerufen werden muss, der aktuelle Thread ist worker. –

Verwandte Themen