Отправьте HttpPost с помощью Async и получите строковый результат - PullRequest
0 голосов
/ 01 апреля 2012

Я относительно новый разработчик Android и не могу понять, как это сделать. Я просматривал все форумы, я сделал некоторый прогресс, но все еще здесь я. Итак, я хочу сделать обычную функцию, которая отправляет запрос POST на веб-страницу (он отправляет только один аргумент POST) и возвращает результат в виде строки. У меня есть основная тема здесь

public class AppActivity extends Activity {
    HTTPPostData PostData = new HTTPPostData("id");
    PostData.execute();
    txtLabel.setText(PostData.Result);
}

и у меня есть асинхронный класс HTTPPostData

public class HTTPPostData extends AsyncTask<String, Long, Object> {
String Value = null;
String Result = null;

public HTTPPostData(String query) {
    Value = query;
    }

@Override
protected String doInBackground(String... params) {
    byte[] Bresult = null;
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://www.mypage.com/script.php");
        try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("cmd", Value));
            post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                Bresult = EntityUtils.toByteArray(response.getEntity());
                Result = new String(Bresult, "UTF-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (Exception e) {
        }
        return Result;
    }
}

Я хочу использовать эту функцию несколько раз (внутри одной и той же операции или делиться ею с другими действиями того же приложения). Я немного запутался в этот момент, поэтому мне нужна ваша помощь. Что я понимаю, так это то, что я запрашиваю результат до того, как doInBackground () будет выполнен, и я получаю пустой результат.

Заранее спасибо за помощь

1 Ответ

1 голос
/ 01 апреля 2012

Относительно этого:

HTTPPostData PostData = new HTTPPostData("id");
PostData.execute();
txtLabel.setText(PostData.Result);

Ваша проблема в том, что вы рассматриваете асинктическую задачу, как будто это обычная функция.Хорошо, что вы перемещаете загрузку веб-страницы из основного потока, но если вы зависите от результата для следующей инструкции, то это не очень хорошо для вас, вы все еще блокируете основную программу в ожидании результата.Вы должны думать об AsyncTask как о операции «запусти и забудь», в которой вы не знаете, когда, если вообще когда-нибудь, она вернется.

Лучшее, что можно сделать здесь, было бы что-то вроде:

HTTPPostData PostData = new HTTPPostData("id");
PostData.execute();
txtLabel.setText("Loading...");

, а затем в асинхронной задаче:

protected void onPostExecute(String result) {
     txtLabel.setText(result);
}

Это позволяет вашему основному потоку продолжить работуэто дело, не зная результата асинктической задачи, и затем, как только данные станут доступны, асинктическая задача заполнит текстовую метку результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...