-2

I'm trying to fetch the username and password values from the mysql database using soap. but i'm getting 'android.os.NetworkOnMainThreadException', please tell me how to use AsyncTask to avoid this exception.

package com.example.androidloginexampleactivity;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
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 AndroidLoginExampleActivity extends Activity {
    private final String NAMESPACE = "http://10.0.2.2:80/urn:stockserver";
    private final String URL = "http://10.0.2.2:80/stockserver1.php?wsdl";

    //private final String URL = " http://10.0.2.2:8080/WebApplication2/Login?Tester";
    private final String SOAP_ACTION = "http://10.0.2.2:80/urn:stockserver#getStockQuote";
    private final String METHOD_NAME = "getStockQuote";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_login_example);
        Button login = (Button) findViewById(R.id.btn_login);
        login.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                loginAction();
            }
        });
    }

    private void loginAction(){
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        EditText userName = (EditText) findViewById(R.id.tf_userName);
        String user_Name = userName.getText().toString();
        EditText userPassword = (EditText) findViewById(R.id.tf_password);
        String user_Password = userPassword.getText().toString();

        //Pass value for userName variable of the web service
        PropertyInfo unameProp =new PropertyInfo();
        unameProp.setName("userName");//Define the variable name in the web service method
        unameProp.setValue(user_Name);//set value for userName variable
        unameProp.setType(String.class);//Define the type of the variable
        request.addProperty(unameProp);//Pass properties to the variable

        //Pass value for Password variable of the web service
        PropertyInfo passwordProp =new PropertyInfo();
        passwordProp.setName("password");
        passwordProp.setValue(user_Password);
        passwordProp.setType(String.class);
        request.addProperty(passwordProp);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try{
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

            TextView result1 = (TextView) findViewById(R.id.tv_status);
            result1.setText(response.toString());
            Toast.makeText(getApplicationContext(), response.toString(), 5).show();

        }
        catch(Exception e){
            Toast.makeText(getApplicationContext(), e.toString(), 5).show();


        }
    }

}
4

2 回答 2

0

将您的 LoginAction 转换为扩展 AsyncTask 的内部类。覆盖 preexecute 方法来完成所有设置。使用 onexecute 方法进行网络通信。在 postexecute 方法中对结果进行任何处理。

这是一个教程: http ://codeoncloud.blogspot.com/2013/07/android-web-service-access-using-async.html

于 2013-10-07T10:44:46.440 回答
0

从 Android 3.0 开始,您不能在主线程上使用网络连接。你最好用 doInBackground 创建一个 AsynTask 来执行你的 httpget。

作者:@marshallino16

看到这个帖子。

于 2013-10-07T10:49:53.237 回答