Создание класса AsyncTask, который можно использовать для любого действия - PullRequest
0 голосов
/ 05 ноября 2011
package de.tablayoutexample;

import java.util.List;

import android.os.AsyncTask;
import android.util.Log;

public class CallWebServiceTask extends AsyncTask<String, String, String> {

    private PhotosActivity theActivity;

    public CallWebServiceTask(PhotosActivity theActivity){

        this.setTheActivity(theActivity);

    }

    @Override
    protected void onPreExecute(){

        PhotosActivity.showSpinner();

    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        return PhotosActivity.getEventList();
    }
    @Override
   protected void onPostExecute(String result) {

        List<SingleEvent> thelist = PhotosActivity.parseJSONResponse(result);

    /*for(int i=0;i<thelist.size();i++){
        SingleEvent entry = thelist.get(i);

        Log.v("Finished", entry.getTitle());

    }*/

        theActivity.refreshListView(thelist);

        PhotosActivity.hideSpinner();



    }

    public PhotosActivity getTheActivity() {
        return theActivity;
    }

    public void setTheActivity(PhotosActivity theActivity) {
        this.theActivity = theActivity;
    }


}

Я не совсем уверен, что делаю, но в итоге я написал вышеупомянутый класс, который работает с моим классом PhotosActivity, который содержит все необходимые методы, которые вызываются. Тем не менее, что если я захочу создать асинхронный класс, который можно будет использовать для всех моих действий? Как бы я это сделал? Я попытался изменить все типы PhotosActivity на «Активность», но, похоже, это еще не все.

Мой вопрос: как бы я сделал этот класс по-настоящему динамичным?

EDIT:

Вот мой базовый класс CustomActivity, который включает в себя класс AsyncTask внутри:

package de.tablayoutexample;

import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;

public class CustomActivity extends Activity{

    public String getEventList() {
        // TODO Auto-generated method stub
        return null;
    }

    public Object parseJSONResponse(String result) {
        // TODO Auto-generated method stub
        return null;
    }

    public void showSpinner() {
        // TODO Auto-generated method stub

    }

    public void refreshListView(Object thelist) {
        // TODO Auto-generated method stub

    }

    public void hideSpinner() {
        // TODO Auto-generated method stub

    }

    public class CallWebServiceTask extends AsyncTask<String, String, String> {

        private CustomActivity theActivity;

        public CallWebServiceTask(CustomActivity theActivity){

            this.setTheActivity(theActivity);

        }

        @Override
        protected void onPreExecute(){

            theActivity.showSpinner();

        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            Log.i("ADASD","EXECUTED");
            return theActivity.getEventList();
        }
        @Override
       protected void onPostExecute(String result) {

            Object thelist = theActivity.parseJSONResponse(result);


            theActivity.refreshListView(thelist);

            theActivity.hideSpinner();



        }

        public CustomActivity getTheActivity() {
            return theActivity;
        }

        public void setTheActivity(CustomActivity theActivity) {
            this.theActivity = theActivity;
        }


    }




}

Таким образом, все работает правильно, за исключением метода parseJSONResponse, потому что тип возвращаемого значения будет различным для каждого действия, которое использует этот базовый класс:

Например, моя PhotosActivity возвращает список моего объекта SingleEvent, который прекрасно делает для меня gson.

public List<SingleEvent> parseJSONResponse(String jsonResponse) {

        //using gson, place all the json into the SingleEvent object and then into a List
        Type listType = new TypeToken<List<SingleEvent>>(){}.getType();  
        List<SingleEvent> events = new Gson().fromJson(jsonResponse, listType);


        return events;

    }

Проблема в том, что в следующем действии будет использоваться другой объект для хранения моих значений. Я не знаю, как бороться с различными типами объектов.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я хочу сказать две вещи:

1) Подумайте об использовании интерфейсов.Если ваши действия реализуют определенный интерфейс, вы можете использовать их взаимозаменяемо.

2) При этом следите за тем, что вы делаете в AsyncTask ... убедитесь, что все, что вы делаете в вашем методе doInBackground, не имеет доступа к коду, который используется потоком пользовательского интерфейса.

1 голос
/ 05 ноября 2011

Будьте осторожны с условиями.«Динамический» - это загруженное слово.это основной OOD.Сделайте статические методы ваших обычных методов PhotosActivity и создайте базовый класс, который расширит все ваши действия.Иметь метод «doWork» в тех действиях, которые вызывает AsyncTask.

есть лучшие способы сделать это, но если это то, что вы ищете, он будет работать.

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