0

Web サービスを呼び出すための単純なクラスを作成しました

public class CallSoap {
    public final String SOAP_ACTION = "http://tempuri.org/Add";

    public  final String OPERATION_NAME = "Add"; 

    public  final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";

    public  final String SOAP_ADDRESS = "http://localhost:41614/Service1.asmx";
    public CallSoap() 
    { 
    }
    public String Call(int a,int b)
    {
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);
    request.addProperty("a",a);
    request.addProperty("b",b);

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

    HttpTransport httpTransport = new HttpTransport(SOAP_ADDRESS);
    Object response=null;
    try
    {
    httpTransport.call(SOAP_ACTION, envelope);
    response = envelope.getResponse();
    }
    catch (Exception exception)
    {
    response=exception.toString();
    }
    return response.toString();
    }
}

これが私のActivityクリック方法です

public void clickData(View v)
{
    //Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText et=(EditText) findViewById(R.id.editText1);
    EditText et2=(EditText) findViewById(R.id.editText2);
    TextView tv=(TextView) findViewById(R.id.textView1);

    int a=Integer.parseInt(et.getText().toString());
    int b=Integer.parseInt(et2.getText().toString()); 

    CallSoap cs=new CallSoap();
    tv.setText(cs.Call(a, b));
}

「残念ながら App1 が停止しました」というエラーが表示されます。私を助けてください..

4

2 に答える 2

0

これは、android 2.2 以降の NetworkOnMainThread 例外が原因です。mainUI スレッドは、アプリケーションをスムーズかつ効率的にするために Ui コンポーネントをロードするためのものであるため、mainUi スレッドでネットワーク アクセスなどの長時間実行される操作を実行できません。おそらく AsynTask クラスを使用してそれを維持する必要があります。メインスレッドから離れて

于 2012-12-31T18:50:19.690 に答える
0

手始めに、また非常に良い習慣として、呼び出しを別のスレッドにします。私はこのようにします:

public void call() {
    Log.d("TAG", "Started call");
    new Thread(new Runnable()
    {
        public void run() {
            Looper.prepare();

            /** UI stuff/ This runs on the main thread to update the UI. This can be used for displaying something like "please wait */

            AppPrefFragment.updateSyncJobsNumber(AppPrefFragment.JOB_START);
            if (AppPrefActivity.context != null) {
                ((Activity) AppPrefActivity.context).runOnUiThread(new Runnable()
                {
                    public void run() {
                        //AppPrefFragment.setSyncPreferenceStatusShowingOngoingJobs();
                        ... show "please wait"
                    }
                });
            }


            /** Actual stuff  that you want to do */

            ... the HttpCall or SOAP etc
        }
    }).start();
}

返品は非同期で処理する必要があることに注意してください。

于 2013-10-10T14:17:10.987 に答える