2011-09-30 145 views
0

我使用下面的代码,我发现互联网上,从我的Android应用程序调用Web服务:调用从Android应用程序的网络服务

public class WebServiceActivity extends Activity { 
    private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld"; 

    private static final String METHOD_NAME = "HelloWorld"; 

    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx"; 


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



     Button getquote = (Button) findViewById(R.id.getquote); 
     getquote.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      TextView result1; 
      result1=(TextView)findViewById(R.id.result1); 
     try { 


      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      EditText CompanyName = (EditText) findViewById(R.id.CompanyName); 
      String val1 = (CompanyName.getText().toString()); 
      request.addProperty("passonString", val1); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet=true; 
      envelope.setOutputSoapObject(request); 

      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
      androidHttpTransport.call(SOAP_ACTION, envelope); 

      Object result = (Object)envelope.getResponse(); 

      result1.setText(result.toString()); 
     } catch (Exception e) { 

      result1.setText(e.getMessage()); 
      } 
    } 
}); 

} 

}

我收到错误的应用没有回应。我是新来的,请帮忙。 在此先感谢

+0

ANR在“主”线程中发生某些长操作时发生。这是事件循环线程,如果它很忙,Android无法在应用程序中处理任何进一步的GUI事件,从而抛出一个ANR对话框..你必须通过这个:http://developer.android.com/guide /practices/design/responsiveness.html –

回答

0

将您的Web服务请求作为后台任务。通常,网络活动所花费的时间是不可预测的。如果你在上面使用,UI线程将被阻塞。这就是为什么它说“应用程序没有响应”。

我发现这篇文章很棒。 http://www.vogella.de/articles/AndroidPerformance/article.html#concurrency 看看2.背景处理

你的例子可以修改如下。

public class WebServiceActivity extends Activity { 
    private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld"; 

    private static final String METHOD_NAME = "HelloWorld"; 

    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx"; 

    TextView result1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     result1 = (TextView) findViewById(R.id.result1); 

     Button getquote = (Button) findViewById(R.id.getquote); 
     getquote.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       // push soap request into background. 
       new Thread(new Runnable(){ 

        @Override 
        public void run() { 
         doSoapRequest(); 
        } 

       },"DOINBACKGROUND"); 
      } 
     }); 

    } 

    private void doSoapRequest(){ 
     try { 

      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      EditText CompanyName = (EditText) findViewById(R.id.CompanyName); 
      String val1 = (CompanyName.getText().toString()); 
      request.addProperty("passonString", val1); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 

      HttpTransportSE androidHttpTransport = new HttpTransportSE(
        URL); 
      androidHttpTransport.call(SOAP_ACTION, envelope); 

      Object result = (Object) envelope.getResponse(); 

//   result1.setText(result.toString()); 
//   update UI data in a Handler 
      Message msg = new Message(); 
      msg.obj = result.toString(); 
      result1Handler.sendMessage(msg); 
     } catch (Exception e) { 

//   result1.setText(e.getMessage()); 
//   update UI data in a Handler 
      Message msg = new Message(); 
      msg.obj = e.getMessage(); 
      result1Handler.sendMessage(msg); 
     } 
    } 

    private Handler result1Handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      result1.setText(msg.obj.toString()); 
     } 

    }; 

} 
+0

你能给我一些更具体的例子吗?使用处理程序,我发现它有点难以理解,但我试图理解它。 – Ritu

+1

我举了一个例子。试着了解发生了什么。如果你想在上面看到一个进度条,它应该如何修改?提示:显示进度条也是应该在UI线程中完成的。 – prageeth