AsyncTask работает только с первого раза

#android #asynchronous #android-asynctask

#Android #асинхронный #android-asynctask

Вопрос:

Я пытаюсь создать служебный класс HttpClient

Мой код отлично работает при первом выполнении. При отладке второе выполнение не включается и не выполняется, значит, что-то перепутано.

Активность / прослушиватель

     protected String getPage(String url, List<NameValuePair> namevaluePairs, String postOrGet, Activity whichActivity, String dialogText) {
    try {
        httpHelper.setListValues(namevaluePairs);
        httpHelper.setPostOrGet(postOrGet);
        httpHelper.setParentActivity(whichActivity);
        httpHelper.setDialogText(dialogText);
        httpHelper.execute(url);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resultHTML;
}
  

Класс утилиты:

     public class HTTPHelper extends AsyncTask<String, Void, Void> {
    private String resultString;
    private HttpClient httpclient;
    private List<NameValuePair> nameValuePairs;
    private String postOrGet;
    private Activity parentActivity;
    private String Error;
    private String dialogText;
    private ProgressDialog Dialog;
    WebServiceListener listener;

    public HTTPHelper(WebServiceListener listener) {
        this.listener = listener;
        Error = null;
        httpclient = new DefaultHttpClient();
        postOrGet = "get";
        nameValuePairs = null;
        dialogText = "Logging in";
    }

    @Override
    public void onPreExecute() {
        super.onPreExecute();
        Error = null;
        Dialog.setMessage(dialogText);
        Dialog.show();
    }

    @Override
    public void onPostExecute(Void unused) {
        Dialog.dismiss();
        if (Error != null) {
            Toast.makeText(parentActivity, Error, Toast.LENGTH_LONG).show();
        } else {
            ArrayList<String> myList = new ArrayList<String>();
            myList.add(resultString);
            listener.onHTTPGetComplete(myList);
        }
    }

    public void setDialogText(String txt) {
        dialogText = txt;
    }

    public void setListValues(List<NameValuePair> incNameValuePairs) {
        nameValuePairs = incNameValuePairs;
    }

    public void setPostOrGet(String pOrG) {
        postOrGet = pOrG;
    }

    public void setParentActivity(Activity myAct) {
        parentActivity = myAct;
        Dialog = new ProgressDialog(parentActivity);
    }

    @Override
    protected Void doInBackground(String... urls) {
        BufferedReader in = null;
        try {
            HttpGet httpget = new HttpGet(urls[0]);
            HttpPost httppost = new HttpPost(urls[0]);
            HttpResponse response = null;

            if (postOrGet.toLowerCase().contains("post")) {
                httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
                try {
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
                    response = httpclient.execute(httppost);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    response = httpclient.execute(httpget);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            } catch (IOException e) {
                e.printStackTrace();
            }

            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            try {
                while ((line = in.readLine()) != null) {
                    sb.append(line   NL);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            resultString = sb.toString();
            return null;
        } finally {
        }
    }
}
  

Ответ №1:

AsyncTask может быть запущен только один раз , как указано в документации : http://developer.android.com/reference/android/os/AsyncTask.html

Таким образом, для каждого запроса вам нужно создать новый вспомогательный объект.

Редактировать:

Проверьте это: ThreadSafeClientConnManager

Комментарии:

1. Работал как чемпион. Спасибо Ravi и Haphazard. Я бы поддержал вас обоих, но у меня пока недостаточно баллов.

2. @user763472 Вы должны принять хороший ответ, а не только поддержать его. Я не думаю, что вам нужны какие-либо баллы, чтобы принять ответ на ваш вопрос. Принятие ответов побудит людей помочь вам.

3. Привет, Рави, я делал нечто подобное, но это не работает — public void onClick(View v) { int index = groupPos; //now read the corresponding mChildStates field and process the data. boolean chBoxesState[] = mChildCheckStates.get(index); //send this data to back end Log.d("On click Vinit", "I am here"); RequestCloser reqCloser = null; reqCloser = new RequestCloser(); reqCloser.execute(chBoxesState); } Можешь ли ты, пожалуйста, помочь мне

Ответ №2:

Создавайте новый экземпляр AsyncTask ( HTTPHelper в вашем случае) каждый раз, когда вы его выполняете.