0

私はそれらのスレッドを書きました:
Android で複数の Async タスクを効率的に管理する方法
複数の AsyncTasks を同時に実行する -- 不可能ですか?

しかし、私の質問に対する答えが見つかりませんでした。誰かが助けてくれるかもしれません..

ログインPOSTを作成してjson応答を取得するAndroidアプリがあります
。JsonがOKの場合、別のデータをPOSTして別の応答を取得する必要があります。

URLへの投稿を行う非同期クラスを拡張しました:

public class AsyncHttpPost extends AsyncTask<String, String, String> {
    private HashMap<String, String> mData = null;

    public AsyncHttpPost(HashMap<String, String> data) {
        mData = data;
    }

    @Override
    protected String doInBackground(String... params) {
        byte[] result = null;
        String str = "";
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(params[0]);// in this case, params[0] is URL
        try {
            ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
            Iterator<String> it = mData.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next();
                nameValuePair.add(new BasicNameValuePair(key, mData.get(key)));
            }

            post.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8"));
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                result = EntityUtils.toByteArray(response.getEntity());
                str = new String(result, "UTF-8");
            }
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            return null;
        }
        return str;
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            JSONArray Loginjson = new JSONArray(result);
            strStt = Loginjson.getJSONObject(0).getJSONObject("fields").getString("status");
            if (strStt.equals("ERR")) {
                ErrorMsg("Authentication failed");
            } else if (strStt.equals("OK")) {
                ErrorMsg("Login OK!!!");
                ClientPage();
            } else {
                ErrorMsg("Connection Error");
            }
        } catch (JSONException e) {
            ErrorMsg("Connection Error");
        }       
    }
}

ここで、ステータスがエラーの場合、別の POST を取得する必要があります。別の非同期クラスを作成する必要がありますか? 同じすべての手順で?問題は onPostExecute 部分だけが異なることです..実際には「doInBackground」は常に同じです..

同じアクティビティで複数の投稿を簡単に行う方法はありますか?

4

2 に答える 2

0

まず、doInBackground()コードは常に同じままであるため、一般的なユーティリティ クラスに移動することをお勧めします。

それを超えて、次の 2 つの方法のいずれかを実行できます。

  1. ユーティリティ クラスを呼び出すことができる要求の種類ごとに新しい AsyncTask を作成し、独自の AsyncTask を作成します。onPostExecute()
  2. フラグを持つ AsyncTask を 1 つ作成します。これをonPostExecute()メソッドでチェックして、そこで実行する必要があるコードを確認できます。コンストラクターでフラグを渡すか、実行のパラメーターとして渡す必要があります。
于 2013-06-22T19:42:52.333 に答える
0

コンストラクター/実行またはグローバル変数でパラメーターを使用してAsyncHttpPost、それが最初または 2 番目の POST (つまり、フラグ) であるかどうかを示すことができます。AsyncHttpPost次に、 inの別のインスタンスを作成して実行しますonPostExecute(パラメーター/変数が"first POST"として設定されている場合のみ)。

于 2013-06-22T19:45:06.360 に答える