1

私はアンドロイドアプリケーションを持っています。

android.os.NetworkOnMainThreadException が発生するため、別のタスクでコードを実行する必要があります。

これは私のコードです:

 public class AccesoCuentaActivity extends Activity{
   public void validacion(View v) throws IOException, XmlPullParserException
{
    try {
    String usuario=((EditText)findViewById(R.id.etUsu)).getText().toString();
    String pass=((EditText)findViewById(R.id.etPass)).getText().toString();
    String[] pars = new String[2];

             String[] = new String[2];
             pars[0] = usuario;
    pars[1] = pass;
            new ValidacionThread().execute(pars);
             Intent intent=new Intent(this, MainActivity.class);
    intent.putExtra("idBoton",12);
    intent.putExtra("usuario",usu);
    startActivityForResult(intent, 0);          

} }

仕事:

public class ValidacionThread extends AsyncTask<String, Void, Usuario> {

    private final String NAMESPACE = "http://webservices.pcp/";
    private final String URL = "http://127.0.0.1:8080/webServices/pcpWS?wsdl";
    private final String SOAPACTION = "";
    private final String METHOD = "ValidarUsuario";

    protected Usuario doInBackground(String[] pars) {

               String user = pars[0];
               String password = pars[1];
                SoapObject request = new SoapObject(NAMESPACE, METHOD); 
                SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                sobre.dotNet = false;       
                request.addProperty("login", user);        
                request.addProperty("password", password); 
                sobre.setOutputSoapObject(request); 

                HttpTransportSE transporte = new HttpTransportSE(URL);        
                try {
                    transporte.call(SOAPACTION, sobre);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                SoapObject resultado = null;
                try {
                    resultado = (SoapObject)sobre.getResponse();
                } catch (SoapFault e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Usuario usu = new Usuario();
                usu.IdUsuario= resultado.getProperty(0).toString();
                usu.Nombre = resultado.getProperty(1).toString();
                usu.Apellidos = resultado.getProperty(2).toString();
                usu.Rol = resultado.getProperty(3).toString();   
                usu.Centro=resultado.getProperty(4).toString();
                return usu;     

}
       protected void  onPostExecute(ValidacionThread vt) {

        }
}

それは私に2つの問題を与えます:

1) クラス AccesoCuentaActivity :

変数「usuario」の戻り値をValidationThread.doInBackground()に保存したい。しかし、どうすればいいですか?

確かに、次のように書くと: new ValidacionThread().execute(pars); 変数 "usu" (intent.putExtra("usuario",usu);) が初期化されていないことがわかります

while with code (メインコード内) Usuario usu = new ValidacionThread().execute(pars); それはタイプの不一致を言います

2)doInBackground()インラインEclipseは警告ValidacionThread.doInBackground(String[])を出します:Varargsメソッドは、およびとは異なり、他のvarargsメソッドによってのみオーバーライドまたはオーバーライドされる必要がありますAsyncTask<String,Void,Usuario>.doInBackground(String...)

4

1 に答える 1

0

これは非同期タスクであるため、そのデータを返す方法を作成する必要があります。次のようなインターフェイスを作成することをお勧めします。

interface{ public void parseData(Usuario data); }

アクティビティクラスに実装します。

次に、コンストラクターでその非同期タスクにアクティビティのインスタンスを渡します。

次に、ValidationThread で:

protected void onPostExecute(Usuario vt) { activityInstance.parseData(vt); }

2 番目の部分については、String[] を String に変更します。

于 2012-06-12T17:34:59.780 に答える