2012-06-11 60 views
1

我有一個android應用程序。在Android應用程序中處理AsynTask的結果

我需要在一個單獨的任務上執行一個代碼,因爲它使我失去了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) { 

     } 
} 

它給了我兩個問題:

1)班AccesoCuentaActivity:

我想將變量「usuario」返回保存在ValidationThread.doInBackground()。但我該怎麼做?

確實如果我只寫:新的ValidacionThread().execute(pars);它告訴我,變量 「通常指」(intent.putExtra( 「usuario」,通常指);)尚未被初始化

,同時用代碼(在主代碼)Usuario烏蘇=新ValidacionThread()執行(。收杆);它說類型不匹配

2)在doInBackground()線日食給警告: 可變參數的方法應該只覆蓋或其它覆蓋可變參數不像ValidacionThread.doInBackground(String[])AsyncTask<String,Void,Usuario>.doInBackground(String...)

回答

0

由於該方法是異步任務你需要爲這些數據創建一個返回途徑。 我會建議創建一個接口,如:

interface{ public void parseData(Usuario data); }

,並在活動類實現它。

然後,我會傳遞和活動的實例在構造函數中的異步任務。

然後在您的ValidationThread:

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

至於第二部分變化的String []爲String ..

相關問題