创建可用于任何活动的AsyncTask类

时间:2011-11-05 02:02:39

标签: android android-asynctask

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类,它包含所有必需的调用方法。但是,如果我想创建一个可用于我所有活动的asynctask类,该怎么办?我该怎么办?我尝试将所有PhotosActivity类型更改为“Activity”,但这似乎并不是它的全部内容。

我的问题是,我如何才能使这个课程真正充满活力?

编辑:

这是我的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方法之外,一切都正常工作,因为对于使用这个基类的每个Activity,返回类型都是不同的:

例如,我的PhotosActivity返回一个我的SingleEvent对象的List,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;

    }

问题是下一个Activity将使用不同的对象来存储我的值。我不知道如何处理不同的对象类型。

2 个答案:

答案 0 :(得分:1)

小心这些条款。 “动态”是一个加载的单词。这是基本的OOD。制作PhotosActivity常规方法的静态方法,并创建一个所有活动都扩展的基类。在AsyncTask调用的那些活动中使用“doWork”方法。

有更好的方法来做这种事情,但如果你正在寻找它,那它就会起作用。

答案 1 :(得分:1)

我有两件事要说:

1)考虑使用接口。通过让您的Activities实现特定的接口,您可以互换使用它们。

2)话虽如此,请注意你在AsyncTask中所做的事情......确保你在doInBackground方法中所做的任何操作都不会访问UI线程正在使用的代码。