多个异步任务,用于在同一活动中发布

时间:2013-06-22 19:31:54

标签: android android-asynctask

我写了这些帖子:
How to manage multiple Async Tasks efficiently in Android
Running multiple AsyncTasks at the same time -- not possible?

但没有找到我的问题的答案,也许有人可以提供帮助..

我有Android应用程序,它使登录POST和获得json响应,
如果Json没问题,我需要POST另一个数据来获得另一个响应。

我已经扩展了Async Class,它将帖子发送到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");
        }       
    }
}

现在 - 如果状态为Error,我需要再次发送POST。我需要制作另一个Async类吗?与所有程序相同?问题是只有onPostExecute部分不同..实际上“doInBackground”将始终是相同的..

任何想法如何在同一活动中轻松完成多个帖子?

2 个答案:

答案 0 :(得分:0)

首先,由于您的doInBackground()代码将始终保持不变,因此我建议您将其移至常规实用程序类中。

除此之外,您可以采用以下两种方式之一:

  1. 为可以调用您的实用程序类的每种类型的请求创建一个新的AsyncTask,并拥有自己的onPostExecute()
  2. 创建一个包含标志的AsyncTask,可以在onPostExecute()方法中检查,以查看需要在那里执行的代码。您必须在构造函数中传递标志,或者作为execute中的参数传递。

答案 1 :(得分:0)

您可以使用AsyncHttpPost构造函数/执行或全局变量中的参数来指示它是第一个还是第二个POST(换句话说 - 一个标志)。然后在AsyncHttpPost中创建并执行onPostExecute的另一个实例(仅当参数/变量设置为“first POST”时)。