-4

我使用了本教程并做了一些更改,它应该适用于 android 4.0.3。

但它仍然没有。

有人可以给我一个正确的解决方案吗?

package com.webservice;
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.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class FirstScreen extends Activity

{
/** Called when the activity is first created. */

private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
private static String SOAP_ACTION2 = "http://tempuri.org/CelsiusToFahrenheit";
private static String NAMESPACE = "http://tempuri.org/";
private static String METHOD_NAME1 = "FahrenheitToCelsius";
private static String METHOD_NAME2 = "CelsiusToFahrenheit";
private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
Button btnFar,btnCel,btnClear;
EditText txtFar,txtCel;

@Override
public void onCreate(Bundle savedInstanceState)

{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first_screen); 
        btnFar = (Button)findViewById(R.id.btnFar);
        btnCel = (Button)findViewById(R.id.btnCel);
        btnClear = (Button)findViewById(R.id.btnClear);
        txtFar = (EditText)findViewById(R.id.txtFar);
        txtCel = (EditText)findViewById(R.id.txtCel);
        
        btnFar.setOnClickListener(new View.OnClickListener()
        {
                 @Override
                  public void onClick(View v)
                  {
                      new one1().execute();
                  }
            });            
        btnCel.setOnClickListener(new View.OnClickListener()
        {
                  @Override
                  public void onClick(View v)
                  {
                      new one2().execute();
                  }
            });
        
        btnClear.setOnClickListener(new View.OnClickListener()
        {
                  @Override
                  public void onClick(View v)
                  {
                        txtCel.setText("");
                        txtFar.setText("");
                  }
            });     
 }
    
private class one1 extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
           //Initialize soap request + add parameters
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);    
      
        //Use this to add parameters
        request.addProperty("Fahrenheit",txtFar.getText().toString());         

        //Declare the version of the SOAP request
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);          

        envelope.setOutputSoapObject(request);
        envelope.dotNet = true;         

        try {
              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);                

              //this is the actual part that will call the webservice
              androidHttpTransport.call(SOAP_ACTION1, envelope);
             
              // Get the SoapResult from the envelope body.
              SoapObject result = (SoapObject)envelope.bodyIn;
              if(result != null)
              {
                    //Get the first property and change the label text
                    txtCel.setText(result.getProperty(0).toString());
              }
              else
              {
                    Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();
              }
        } catch (Exception e) {

              e.printStackTrace();

        }           
        return null;
    }
    
}

private class one2 extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        //Initialize soap request + add parameters
  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);     

  //Use this to add parameters
  request.addProperty("Celsius",txtCel.getText().toString());     

  //Declare the version of the SOAP request
  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);    

  envelope.setOutputSoapObject(request);
  envelope.dotNet = true;   

  try {
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);          

        //this is the actual part that will call the webservice
        androidHttpTransport.call(SOAP_ACTION2, envelope);          

        // Get the SoapResult from the envelope body.            
        SoapObject result = (SoapObject)envelope.bodyIn;            
        if(result != null)
        {
              //Get the first property and change the label text
              txtFar.setText(result.getProperty(0).toString());

        }
        else
        {

              Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();

        }
  } catch (Exception e) {
        e.printStackTrace();
  }         return null;
    }
    
}
}

错误日志和代码

private class one1 extends AsyncTask<String, Integer, SoapObject> {

protected SoapObject doInBackground(String... arg0) {

protected **void** onPreExecute(**)**
 {
     //value from textview/edittext
 }

// TODO Auto-generated method stub
   //Initialize soap request + add parameters
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);    

//Use this to add parameters
request.addProperty("Fahrenheit","30");// provide value here        

//Declare the version of the SOAP request
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);          

envelope.setOutputSoapObject(request);
envelope.dotNet = true;         

try {
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);                
      androidHttpTransport.call(SOAP_ACTION1, envelope);
      **result** = (SoapObject)envelope.bodyIn;

} catch (Exception e) {

      e.printStackTrace();

}           
return **result**;
   }

   protected void onPostExecute(SoapObject result)
   {
if(result != null)
{
  System.out.println(result.getProperty(0).toString());
}
else
{
  Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();
}
}

}
}

我收到以下语法错误:

语法错误,插入“枚举标识符”以完成 EnumHeader 令牌“void”上的语法错误,@预期结果无法解析为变量 FirstScreen.java 结果无法解析为变量 FirstScreen.java

编辑代码:

package com.webservice;

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.app.ProgressDialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;



public class FirstScreen extends Activity
{


     private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
     private static String NAMESPACE = "http://tempuri.org/";
     private static String METHOD_NAME1 = "FahrenheitToCelsius";
     private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
     SoapObject result;
     Button b;
     EditText et;
     int value;
     TextView tv;
     ProgressDialog pd;

     @Override
      public void onCreate(Bundle savedInstanceState)
      {

        super.onCreate(savedInstanceState);
        pd= new ProgressDialog(this);
        pd.setTitle("Making Soap Request");
        setContentView(R.layout.activity_first_screen); 
        b= (Button) findViewById(R.id.button1);
        tv= (TextView) findViewById(R.id.textView2);
        et= (EditText) findViewById(R.id.ed);           
                b.setOnClickListener(new OnClickListener()
                {

               @Override
               public void onClick(View v) {
               // TODO Auto-generated method stub
                value=Integer.parseInt(et.getText().toString());
                new one1().execute();
        }
    });


    }

     private class one1 extends AsyncTask<String, Integer, SoapObject> {

      protected void onPreExecute()
      {
          pd.show();
      }
    protected SoapObject doInBackground(String... arg0) {
        // TODO Auto-generated method stub
           //Initialize soap request + add parameters
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);    

        //Use this to add parameters
        request.addProperty("Fahrenheit",value);         

        //Declare the version of the SOAP request
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);          

        envelope.setOutputSoapObject(request);
        envelope.dotNet = true;         

        try {
              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);                
              androidHttpTransport.call(SOAP_ACTION1, envelope);
              result = (SoapObject)envelope.bodyIn;

        } catch (Exception e) {

              e.printStackTrace();

        }           
        return result;
    }

     protected void onPostExecute(SoapObject result)
     {
      pd.dismiss();
    if(result != null)
    {
          tv.setText("Result = "+result.getProperty(0).toString());
    }
    else
    {
          Toast.makeText(getApplicationContext(), "No       Response",Toast.LENGTH_LONG).show();
    }
    }

    }
}
4

2 回答 2

0

您正在后台线程中更新 UI。您必须在 UI 线程上更新 UI。

在 doInBackground() 中返回结果

在 onPostExecute() 更新 ui。

   Void onPostExecute(int result)  
   {
       if(result != null)
    {
          txtFar.setText(result.getProperty(0).toString());

    }
    else
    {

     Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();

    }
 }

http://developer.android.com/reference/android/os/AsyncTask.html。查看链接,尤其是The 4 steps下的主题。

在您的活动中。

new SoapRequestTask().execute();//call asyntask from ui.


private class SoapRequestTask extends AsyncTask<Void, Void, Long> {

 protected void onPreExecute() {
     //display progress dialog
 }

 protected Long doInBackground(Void... params) {

   //make soap request and get result. do not update ui here.
     return result;
 }



 protected void onPostExecute(Long result) {
     //dismiss dialog. update ui here.
 }
}

http://10keyes.blogspot.in/2012/08/android-implement-ksoap2-in-asynctask.html。asynctask 和 ksoap 的教程。

编辑

 public class FirstScreen extends Activity
 {
 private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
 private static String NAMESPACE = "http://tempuri.org/";
 private static String METHOD_NAME1 = "FahrenheitToCelsius";
 private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
SoapObject result;
 Button b;
 EditText et;
 int value;
 TextView tv;
 ProgressDialog pd;

 @Override
  public void onCreate(Bundle savedInstanceState)
  {

    super.onCreate(savedInstanceState);
    pd= new ProgressDialog(this);
    pd.setTitle("Making Soap Request");
    setContentView(R.layout.activity_main); 
    b= (Button) findViewById(R.id.button1);
    tv= (TextView) findViewById(R.id.textView2);
    et= (EditText) findViewById(R.id.ed);
    b.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            value=Integer.parseInt(et.getText().toString());
            new one1().execute();
        }

    });


}

 private class one1 extends AsyncTask<String, Integer, SoapObject> {

  protected void onPreExecute()
  {
      pd.show();
  }
protected SoapObject doInBackground(String... arg0) {
    // TODO Auto-generated method stub
       //Initialize soap request + add parameters
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);    

    //Use this to add parameters
    request.addProperty("Fahrenheit",value);         

    //Declare the version of the SOAP request
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);          

    envelope.setOutputSoapObject(request);
    envelope.dotNet = true;         

    try {
          HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);                
          androidHttpTransport.call(SOAP_ACTION1, envelope);
          result = (SoapObject)envelope.bodyIn;

    } catch (Exception e) {

          e.printStackTrace();

    }           
    return result;
}

 protected void onPostExecute(SoapObject result)
 {
  pd.dismiss();
if(result != null)
{
      tv.setText("Result = "+result.getProperty(0).toString());
}
else
{
      Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();
}
}

}

我的activity_main.xml

 <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"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="FahrenheitToCelsius" />

<EditText
    android:id="@+id/ed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="43dp" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="37dp"
    android:text="MakeRequest" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="20dp"
    android:text="Result" />

 </LinearLayout>

结果在我的手机上。

在此处输入图像描述

于 2013-03-20T11:13:36.450 回答
0

您无法在 DoInBackground() 方法中访问任何 UI 元素,因为它在自己的线程上运行,而不是在 UI 线程上运行。你应该使用

txtFar.setText(result.getProperty(0).toString());

Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();

调用 onPostExecute 或 onProgressChanged() 方法。

于 2013-03-20T11:15:13.733 回答