Вопрос по java, android, android-asynctask – Android, можно ли поместить AsyncTask в отдельный класс и получить обратный вызов?

17

Я только изучаю AsyncTask и хочу использовать его как отдельный класс, а не как подкласс.

Например,

class inetloader extends AsyncTask<String, Void, String> {


    @Override
    protected String doInBackground(String... urls) {

        String response = "";

            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(urls[0]);
            try {
                HttpResponse execute = client.execute(httpGet);
                InputStream content = execute.getEntity().getContent();

                BufferedReader buffer = new BufferedReader(
                        new InputStreamReader(content));
                String s = "";
                while ((s = buffer.readLine()) != null) {
                    response += s;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        return response;
    }


    @Override
    protected void onPostExecute(String result) {
        Log.e("xx",result);
        // how do I pass this result back to the thread, that created me?
    }


}

и основной (пользовательский) поток:

inetloader il = new inetloader();
il.execute("http://www.google.com");
//il.onResult()
//{
    ///do something...
//}

Спасибо!

Да, вы можете поместить его в отдельный класс, но большинство людей этого не делают, потому что его цель обычно намного более ясна, если это внутренний класс. Если вы собираетесь использовать его во многих мероприятиях, продолжайте. keyser
используйте интерфейс, просто реализуйте свою деятельность с помощью интерфейса и в onPostExcute () класса Asyn вызывайте mContext.implementedMethod (). Anand Tiwari
Наличие этого в отдельном классе также помогает с контролем версий & amp; управление изменениями. Kris Krause
Я планирую использовать его для других целей, например, если я позвоню отсюда, по результату он должен сделать это и что, если я вызову его оттуда, по результату он должен сделать что-то еще ... для этого, если я оставлю это в тот же класс, и чтобы он вызывал функцию из этого класса в результате, мне нужно будет создать новый AsyncTask для каждого вида действия, которое он должен выполнить в результате ... Roger Travis
Кстати, названия классов начинаются с заглавной буквы, например, & Quot; InetLoader & Quot; просто базовое соглашение Java. Richard Le Mesurier

Ваш Ответ

3   ответа
3

ействия оттуда ...
Как использовать интерфейс:

public interface ResultUpdatable {

   public void setResult(Object obj);
   }

Реализуйте это в Activity и передайте в конструктор асинхронной задачи и обновите результат изonPostExecute с помощьюsetResult функция.

33

interface CallBackListener{
  public void callback();
}

Затем сделайте это в вашей ветке пользовательского интерфейса:

inetloader il = new inetloader();
li.setListener(this);
il.execute("http://www.google.com");

В inetloader добавьте:

   CallBackListener mListener;

   public void setListener(CallBackListener listener){
     mListener = listener;
   }

затем в postExecute () выполните:

   mListener.callback();
Хм ... странно, у меня нет "CallBackListener" в андроиде v3, может быть, оно носит другое имя? Roger Travis
@RogerTravis Да, вы должны сами создать интерфейс CallBackListener. И не забудьте добавить «реализует CallBackLisnter» для вашего основного класса пользовательского интерфейса.
Спасибо, похоже, это правильное направление. Особенно, если бы я мог создать CallBackListener с помощью inetloader il = new inetloader (); и передать его в объект il. Roger Travis
Вы можете добавить в интерфейс столько методов, сколько захотите.
ой, кажется, он дает только один @Override public void callback () {для потока пользовательского интерфейса. Есть ли способ для меня сделать несколько обратных вызовов () {} для каждого объекта inetloader, который я делаю? Roger Travis
1
inetloader il = new inetloader();
il.execute("http://www.google.com");

String result = il.get();//put it in try-catch
                ^^^^^^^^ 

here you get result which is in onPostExecute(String result)

Не совсем :( Мне нужен какой-то прослушиватель onResult, который сработает после завершения AsyncTask, потому что запрос некоторых серверов может занять некоторое время. С другой стороны, включение il.get () в цикл while (true) может звучит слишком примитивно, не так ли? :) Есть ли лучшие варианты? Roger Travis
@ Самир: Это действительно плохая идея. Хотя это позволяет получить результат изAsyncTask, с использованиемget() Метод блокирует поток пользовательского интерфейса и эффективно превращает асинхронную процедуру в синхронную. Единственное действительное использование дляget() метод, который я когда-либо придумал, был бы для «цепочки»; дваAsyncTasks.

Похожие вопросы