【问题标题】:Connect .net Webservice with Android将 .net Web 服务与 Android 连接
【发布时间】:2016-09-01 05:24:15
【问题描述】:

Webservice类代码:

public class WebService {

    String namespace = "http://www.webserviceX.NET/";
    private String url = "http://www.webservicex.net/ConvertWeight.asmx";

    String SOAP_ACTION;
    SoapObject request = null, objMessages = null;
    SoapSerializationEnvelope envelope;
    AndroidHttpTransport androidHttpTransport;

    WebService() {
    }
    protected void SetEnvelope() {

        try {

            // Creating SOAP envelope
            envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            //You can comment that line if your web service is not .NET one.
            envelope.dotNet = true;

            envelope.setOutputSoapObject(request);
            androidHttpTransport = new AndroidHttpTransport(url);
            androidHttpTransport.debug = true;

        } catch (Exception e) {
            System.out.println("Soap Exception---->>>" + e.toString());
        }
    }

    // MethodName variable is define for which webservice function  will call
    public String getConvertedWeight(String MethodName, String weight,
                                     String fromUnit, String toUnit)
    {

        try {
            SOAP_ACTION = namespace + MethodName;

            //Adding values to request object
            request = new SoapObject(namespace, MethodName);

            //Adding Double value to request object
            PropertyInfo weightProp =new PropertyInfo();
            weightProp.setName("Weight");
            weightProp.setValue(weight);
            weightProp.setType(double.class);
            request.addProperty(weightProp);

            //Adding String value to request object
            request.addProperty("FromUnit", "" + fromUnit);
            request.addProperty("ToUnit", "" + toUnit);

            SetEnvelope();

            try {

                //SOAP calling webservice
                androidHttpTransport.call(SOAP_ACTION, envelope);

                //Got Webservice response
                String result = envelope.getResponse().toString();

                return result;

            } catch (Exception e) {
                // TODO: handle exception
                return e.toString();
            }
        } catch (Exception e) {
            // TODO: handle exception
            return e.toString();
        }
    }
} 

我更新的活动代码:

public class CheckDNLoginActivity extends Activity {

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

        final Button webserviceCallButton = (Button) findViewById(R.id.webservice);
        final TextView webserviceResponse = (TextView) findViewById(R.id.webserviceResponse);

        webserviceCallButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                webserviceResponse.setText("Requesting to server .....");

                new ExecuteService().execute();

             }
         });
     }


     class ExecuteService extends AsyncTask<String, Void, String> {

            @Override
            protected String doInBackground(String... params) {
                //Create Webservice class object
                WebService com = new WebService();

                // Initialize variables
                String weight   = "18000";
                String fromUnit = "Grams";
                String toUnit   = "Kilograms";

                //Call Webservice class method and pass values and get response
                String aResponse = com.getConvertedWeight("ConvertWeight", weight, fromUnit, toUnit);

                //Alert message to show webservice response
                Toast.makeText(getApplicationContext(), weight+" Gram= "+aResponse+" Kilograms",
                        Toast.LENGTH_LONG).show();

                Log.i("AndroidExampleOutput", "----"+aResponse);
                return aResponse;
            }

            @Override
            protected void onPostExecute(String result) {
                webserviceResponse.setText("Response : "+ result);

            }

            @Override
            protected void onPreExecute() {}
        }
}

这是我更新的 logcat 。当我运行我的应用程序时,我得到了一个错误:,

FATAL EXCEPTION: main
      Process: com.example.dell.piechart2, PID: 2762
      java.lang.NullPointerException
          at com.example.dell.piechart2.CheckDNLoginActivity$ExecuteService.onPostExecute(CheckDNLoginActivity.java:63)
          at com.example.dell.piechart2.CheckDNLoginActivity$ExecuteService.onPostExecute(CheckDNLoginActivity.java:38)
          at android.os.AsyncTask.finish(AsyncTask.java:632)
          at android.os.AsyncTask.access$600(AsyncTask.java:177)
          at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
          at android.os.Handler.dispatchMessage(Handler.java:102)
          at android.os.Looper.loop(Looper.java:136)
          at android.app.ActivityThread.main(ActivityThread.java:5017)
          at java.lang.reflect.Method.invokeNative(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:515)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
          at dalvik.system.NativeStart.main(Native Method)

有什么问题?请帮我。我在这里发布了我的完整 logcat。你也可以检查一下。 提前致谢。

【问题讨论】:

  • 这意味着不要像网络操作那样在主线程上做昂贵的任务。
  • 请帮帮我,伙计们...我正在尝试 3 到 4 天。但我没有得到结果。有人请帮助我
  • 你能详细说明吗???

标签: android android-ksoap2 networkonmainthread


【解决方案1】:

您需要使用如下的异步任务类,

首先通过下面改变你的按钮点击事件

  webserviceCallButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            webserviceResponse.setText("Requesting to server .....");

            new ExecuteService().execute();

        }
    });

现在,在下方查看您的整个活动代码

    public class CheckDNLoginActivity extends Activity {

        Button webserviceCallButton;
        TextView webserviceResponse;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            webserviceCallButton = (Button) findViewById(R.id.webservice);
            webserviceResponse = (TextView) findViewById(R.id.webserviceResponse);

            webserviceCallButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    webserviceResponse.setText("Requesting to server .....");

                    new ExecuteService().execute();

                 }
             });
         }


     class ExecuteService extends AsyncTask<String, Void, String> {

            @Override
            protected String doInBackground(String... params) {
                //Create Webservice class object
                WebService com = new WebService();

                // Initialize variables
                String weight   = "18000";
                String fromUnit = "Grams";
                String toUnit   = "Kilograms";

                //Call Webservice class method and pass values and get response
                String aResponse = com.getConvertedWeight("ConvertWeight", weight, fromUnit, toUnit);

                //Alert message to show webservice response
                Toast.makeText(getApplicationContext(), weight+" Gram= "+aResponse+" Kilograms",
                    Toast.LENGTH_LONG).show();

                Log.i("AndroidExampleOutput", "----"+aResponse);
                return aResponse;
            }

            @Override
            protected void onPostExecute(String result) {
                webserviceResponse.setText("Response : "+ result);

            }

            @Override
            protected void onPreExecute() {}
        }
}

【讨论】:

  • ExecuteService 类中的错误..无法识别此方法
  • @ashisharma 你把 ExecuteService 类放在哪里了? , 应该在 CheckDNLoginActivity 类里面检查一下
  • 我将您的代码粘贴到 tOnClickListener 中,然后代码中没有错误。
  • 但是当我运行它时显示..请求服务器然后停止。
  • 不幸停了
【解决方案2】:

NetworkOnMainThreadException 在应用程序尝试在其主线程上执行网络操作时抛出。

您可以使用AsyncTask 进行网络操作。

这是AsyncTask 代码,

private class MyNetworkTask extends AsyncTask<String, String, String>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        webserviceResponse.setText("Requesting to server .....");
    }

    @Override
    protected String doInBackground(String... params) {

        //Create Webservice class object
        WebService com = new WebService();

        // Initialize variables
        String weight   = params[1];
        String fromUnit = params[2];
        String toUnit   = params[3];

        //Call Webservice class method and pass values and get response
        return com.getConvertedWeight(params[0], weight, fromUnit, toUnit);
    }

    @Override
    protected void onPostExecute(String aResponse) {
        webserviceResponse.setText("Response : "+aResponse);
    }
}

这就是你如何称呼AyncTask,

webserviceCallButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        new MyNetworkTask().execute("ConvertWeight", "18000", "Grams", "Kilograms");

    }

});

请参阅this SO 线程了解更多信息。

【讨论】:

  • MyNetworkTask() 类中的错误。这不是调用此方法。无法解析符号
  • doinbackground 方法中的错误..java.lang.RuntimeException: 无法在未调用 Looper.prepare() 的线程内创建处理程序
  • 是的,我使用了更新的代码。当我运行它时,发生了这个错误
【解决方案3】:

试试这个

 public class request extends AppCompatActivity {
 TextView webserviceResponse;

String aResponse="nul";

String f_name="";

WebserviceCall com = new WebserviceCall();

Button webserviceCallButton;

@Override

  protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

    setContentView(R.layout.request);

     webserviceCallButton = (Button) findViewById(R.id.button);
     webserviceResponse = (TextView) findViewById(R.id.textView);

    webserviceCallButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            f_name   = "1";

            new LongOperation().execute("");


        }
    });

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

    @Override
    protected String doInBackground(String... params) {


        //Create Webservice class object

        // Initialize variables

        //Call Webservice class method and pass values and get response
        aResponse = com.getchange_liveserver("wb", f_name);

        //Alert message to show webservice response

        Log.i("AndroidExampleOutput", "----"+aResponse);

      //  webserviceResponse.setText("Executed"); // txt.setText(result);
        // might want to change "executed" for the returned string passed

        // into onPostExecute() but that is upto you
        return "Executed";
    }

    @Override
    protected void onPostExecute(String result) {


        webserviceResponse.setText("Response : "+aResponse);


    }









 @Override
    protected void onPreExecute() {               
  webserviceResponse.setText("Requesting to server .....");
    }

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

}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2011-10-11
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多