0

こんにちは、変数を AsyncTask に渡したいです

私はこの変数を持っています

private static String NAMESPACE = "aaa";
private static String METHOD_NAME = "bbb";
private static String SOAP_ACTION =  NAMESPACE + METHOD_NAME ;
private static String URL = "ccc";

そして私はこのタスクを持っています

    public class Login extends AsyncTask<Void, Void, String>
    {
    ProgressDialog progress;
String response = "";
    private ProgressDialog pDialog;
public void onPreExecute() 
  {
    super.onPreExecute();
    pDialog = new ProgressDialog(MainActivity.this);
    pDialog.setMessage("Please Wait");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();
  }
    @Override
protected String doInBackground(Void... arg0)       {
         final SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);             
         request.addProperty("username", user_name);
         request.addProperty("userpass", user_pass);
         final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
         envelope.setOutputSoapObject(request);
         envelope.dotNet = true;
         try 
            {
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                    androidHttpTransport.call(SOAP_ACTION, envelope);                    
                    SoapPrimitive result = (SoapPrimitive) envelope.getResponse();          
                    response = result.toString();
            }
         catch (IOException e) 
            {
             response = "Error In The Operation(1) !!\n Check Internet Connection And TRY AGAIN.";
            }
         catch (Exception e) 
            {
             response = "Error In The Operation(2) !!\n Check Internet Connection And TRY AGAIN.";
            } 
    return response;
    }
@Override
public void onPostExecute(String res)
{
            if(!(res.equalsIgnoreCase("")))
            {
                     if (res.toString().contains(",") == true)
                     {
                   String[] separated = res.split(",");
                   tv.setText(separated[1]);
                   return;
                     }

                 if(res.toString().equals("1"))
                 {
                     res = "Wrong User name OR password ,, TRY AGAIN ..";
                     tv.setText(res);
                     pDialog.dismiss();
                     return;
                 }
                 if(res.toString().equals("2"))
                 {
                     res = "Your Account Is temporarily Blocked ,, Please Call The Admin";
                     tv.setText(res);
                     pDialog.dismiss();
                     return;
                 }
                 if(res.toString().equals("3"))
                 {
                     res = "Error While Retrieve S Information ,, Try Again Later .";
                     tv.setText(res);
                     pDialog.dismiss();
                     return;
                 } 
                tv.setText(res);
                pDialog.dismiss();
            }
}
    }

このタスクを実行したいときに必要です

それを呼び出して上記の変数を渡すには

お気に入り

new Login().execute();

成功する

new Login().execute(URL,NAMESPACE,METHOD,USERNAME,USERPASS);

このタスクが文字列を返すことを知っていると:)

そして、doInBackgroundには user_name と user_pass の値が必要であり、実行呼び出しでそれを渡す必要があります..

よろしく...

4

4 に答える 4

3

以下のように、Login クラスのコンストラクタを作成してみませんか? 私の場合、アクティビティを AsyncTask に渡して、完了時にコールバック関数を呼び出せるようにしていますが、あなたの場合は、文字列の配列を渡すこともできます。

以下の例では、args 配列がクラス コンストラクターに渡され、params 配列が doInBackground 関数に渡されます。MainActivity は AsyncTask に渡されるため、タスクが完了すると、MainActivity で taskDone コールバックを呼び出すことができます。

public class Login extends AsyncTask<String, Void, String>
{
    private MainActivity activity;

    //These private strings are only needed if you require them
    //outside of the doInBackground function.... 
    //If not, just use the params argument of doInBackground by itself
    private String METHODNAME,
    private String NAMESPACE;
    private String SOAPACTION;
    private String USER_NAME;
    private String USER_PASS;

    public Login(String[] args, MainActivity activity) {
        this.NAMESPACE= args[0];
        this.METHODNAME = args[1];
        this.SOAPACTION = args[2];
        this.USER_NAME = args[3];
        this.USER_PASS= args[4];

        this.activity = activity;
    }
    @Override
    protected Void doInBackground(String... params) {
        //Again, use either params local to this function
        //or args local to the entire function... 
        //both would be redundant
        String _NAMESPACE = params[0];
        String _METHODNAME = params[1];
        String _SOAPACTION = params[2];
        String _USER_NAME = params[3];
        String _USER_PASS= params[4];

        //Do background stuff
    }

    protected void onPostExecute() {
        //dismiss progress dialog if needed
        //Callback function in MainActivity to indicate task is done
        activity.taskDone("some string");
    }
}

MainActivity.java

private String[] args= {"mynamespace", "mymethods", "mysoap", "myuser", "mypass"}; //to pass to constructor
private String[] params= {"mynamespace", "mymethods", "mysoap", "myuser", "mypass"}; //to pass to doInBackground

//Pass your args array and the current activity to the AsyncTask
new Login(args, MainActivity.this).execute(params);

//Callback for AsyncTask to call when its completed
public void taskDone(String returnVal) {
    //Do stuff once data has been loaded
    returnText = returnVal;
}
于 2012-12-11T20:25:11.603 に答える
2

クラス Login を拡張AsyncTask<String, Void,String>して に変更doInBackground(Void... params)doInBackground(String... params)ます。これで、必要な方法でタスクを実行しnew Login().execute(URL,NAMESPACE,METHOD,USERNAME,USERPASS);、params[] 配列を介して指定されたパラメーターにアクセスできます。これは、たとえば、params[0] == URL、params[1] == NAMESPACE などを意味します。

于 2012-12-11T20:18:37.197 に答える
1

まず自分が変わる必要がある

public class Login extends AsyncTask<Void, Void, String>

public class Login extends AsyncTask<String, Void, String>

変更する

doInBackground(Void...

doInBackground(String...

これに関する非常に役立つドキュメントがいくつかあります。それでも問題が解決しない場合は、何が機能しているか、または機能していないかについて、もう少し具体的に説明してください。

非同期タスクで使用される 3 つのタイプは次のとおりです。

Params、実行時にタスクに送信されるパラメーターのタイプ。

進行状況、バックグラウンド計算中に発行された進行状況単位のタイプ。

結果、バックグラウンド計算の結果の型。

これらは のパラメータです<String, Void, String>。1つ目 は渡されているものです。これが、渡された文字列の配列を示してStringいる理由doInBackground()ですString...

于 2012-12-11T20:19:05.793 に答える
1

doInbackground(Params... params) (Params[] params と考えてください) は、同じ型である限り、必要な数のパラメーターを受け入れるため、execute で必要な数のパラメーターを渡すことができます。

ただし、パラメーターのタイプが異なる場合 (これはあなたの場合ではありません)、それらを asynctask クラスの属性として持ち、それらの値を asynctask コンストラクターを介して次のように渡す必要がありますnew login(type1 attr1, type2 attr2).execute(params)

于 2012-12-11T20:44:17.673 に答える