Как AsyncTask возвращает параметры в MainActivity

Я новичок в андроиде. Я написал класс асинхронной задачи, который принимает одну строку в качестве параметра. Класс Asynctask имеет две функции doinbackground и onpostexecute. doinbackground выполняет httppost, и если сообщение успешно, оно возвращает строку «Success» для onpostexecute или передает «Failed» для onpostexecute.

В Mainactivity я вызываю класс Async, как показано ниже: new MyAsyncTask().execute(xmlFile);

Но мне нужно получить строку, которую doinbackground возвращает в моей основной деятельности, поскольку на основе этого статуса мне нужно обновить базу данных. Может ли кто-нибудь помочь мне в этом вопросе.

Гипотетически я хочу сделать следующее в MainActivity

////////////////////////

Запустите асинхронный класс, передав строку;;;

если doinbackground возвращает базу данных "Успех"

иначе не обновлять

///////////////////////////

Спасибо


person user3229254    schedule 23.01.2014    source источник


Ответы (3)


Вы можете использовать интерфейс в качестве обратного вызова для действия.

Вы можете проверить ответ черных поясов по ссылке ниже

Как вернуть логическое значение из AsyncTask?

Или вы можете сделать AsyncTask внутренним классом активности и получить результат в onPostExecute.

person Raghunandan    schedule 23.01.2014

У вас есть несколько способов. Один использует Handler для связи Activity с вашим AsyncTask. Это потребует передачи объекта Handler из Activity в AsyncTask и сохранения его там, чтобы вы могли использовать его позже. подробнее об этом здесь .

Другой способ — использовать файл BroadcastReceiver. Вы объявляете его там, где вы хотите его использовать (т.е. где вы хотите получать данные, в данном случае в вашем Activity), и вы используете sendBroadcast от AsyncTask до Activity. Подробнее об этом здесь.

Есть и другие способы, но этот самый распространенный.

person nKn    schedule 23.01.2014

Возможно, вы могли бы просто обновить базу данных в doInBackground вместо onPostExecute таким образом, чтобы у вас был результат и независимо от того, прошел ли HTTP-вызов.

Или вы могли бы заставить AsyncTask возвращать класс, независимо от того, удалось ли это или нет, а затем обработать результат в onPostExecute, но вы вернулись в поток пользовательского интерфейса в этот момент и, возможно, не хотите блокировать с обновлением БД.

private class PostResult {
    boolean succeeded;
    String response;
}
private class PostAsync extends AsyncTask<String, String, PostResult> {
    protected PostResult doInBackground(String... xmlToPost) {
        PostResult result = new PostResult();
        try {
        //do you httpPost... with xmlToPost[0];
            result.response = "your data back from the post...";
            result.succeeded = true;
        //get your string result
        }catch (Exception ex){
            result.succeeded = false;
        }

        // I would update the db right here, 
        // since it's still on the background thread

        return result;
    }

    protected void onPostExecute(PostResult result) {
        //you're back on the ui thread...
        if (result.succeeded){

        }
    }
}
person Patrick Kafka    schedule 23.01.2014