0

SOAP メソッドを使用してリクエストを送信しています。次に、doInBackground の String 変数に Response を格納し、onPostExecute の状態をチェックしています。しかし、順を追って確認したところ、onPostExecuteの値をクリアしていることがわかりました。この問題を解決するには?

protected Void doInBackground(Void... args) {

        request = new SoapObject(NAMESPACE, METHOD_NAME);

        username = new PropertyInfo();
        username.setName("UserName");
        username.setValue(Username);
        username.setType(String.class);
        request.addProperty(username);

        password = new PropertyInfo();
        password.setName("Password");
        password.setValue(Password);
        password.setType(String.class);
        request.addProperty(password);

        SoapSerializationEnvelope envp = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envp.dotNet = true;
        envp.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envp);
            SoapPrimitive response = (SoapPrimitive) envp.getResponse();
            Response = response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        if (dialog != null) {
            dialog.dismiss();
            dialog = null;
        }

        if (Response.equals("Fail")) {
            etPassword.setText("");
            textValidation.setText("UserName Or Password is Wrong.");

        } else {
            etUsername.setText("");
            etPassword.setText("");
        }
    }
4

1 に答える 1

0

AsyncTask クラスをどのように宣言しますか?

AsyncTaskのドキュメントによると

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

Params、実行時にタスクに送信されるパラメーターのタイプ。進行状況、バックグラウンド計算中に発行された進行状況単位のタイプ。結果、バックグラウンド計算の結果の型。すべての型が常に非同期タスクで使用されるわけではありません。タイプを未使用としてマークするには、単にタイプ Void を使用します。

次のようになります。

private class MyAsyncTask extends AsyncTask<Param, Progress, Result>

これにより、署名が次のように定義doInBackground()されます。

protected Result doInBackground(Param... params)

doInBackground()その後、 の代わりにの最後に結果を返すことができますnull

編集 :

あなたの例に適用すると、次のようになります。

public class MyAsyncTask extends AsyncTask<Void, int[], String> {

    protected Void doInBackground(Void... args) {

        request = new SoapObject(NAMESPACE, METHOD_NAME);

        username = new PropertyInfo();
        username.setName("UserName");
        username.setValue(Username);
        username.setType(String.class);
        request.addProperty(username);

        password = new PropertyInfo();
        password.setName("Password");
        password.setValue(Password);
        password.setType(String.class);
        request.addProperty(password);

        SoapSerializationEnvelope envp = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);
        envp.dotNet = true;
        envp.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try {
            androidHttpTransport.call(SOAP_ACTION, envp);
            SoapPrimitive response = (SoapPrimitive) envp.getResponse();
            // return your result here
            return response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        // return null if something went wrong
        return null;
    }

    @Override
    protected void onPostExecute(String result) {

        if (dialog != null) {
            dialog.dismiss();
            dialog = null;
        }

        if (result == null) {
            // handle null here, for example :
            // result = "Fail";
        }

        // use "Fail".equals(result) instead of result.equals("Fail")
        // to avoid error if result is null
        if ("Fail".equals(result)) { 
            etPassword.setText("");
            textValidation.setText("UserName Or Password is Wrong.");

        } else {
        etUsername.setText("");
        etPassword.setText("");
        }
    }
}
于 2013-05-29T07:25:24.043 に答える