Java:Subclassing AsyncTask

时间:2012-01-25 11:10:53

标签: java android android-asynctask

我试图通常子类化android.os.AsyncTask类。我基本上只想添加一个属性。问题是,我仍然希望能够将它用作匿名类。

    import android.content.Context;
    import android.os.AsyncTask;

    public class KAsyncTask extends AsyncTask<Params, Progress, Result> {
        public Context c;

    }

我已经尝试过对它进行子类化,但我无法将它包裹在我的头脑中。我应该这样做。

此致 EZFrag

3 个答案:

答案 0 :(得分:16)

你的意思是你仍然希望它成为像AsyncTask这样的抽象模板类?宣言将是:

public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
    public Context c;

}

答案 1 :(得分:6)

感谢Reuben,它按预期工作100%。

以下是我现在所拥有的:

    import android.content.Context;
    import android.os.AsyncTask;

    public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
        public Context context;

        public KAsyncTask<Params, Progress, Result> setContext(Context c){
            this.context = c;
            return this;
        }
    }

这就是我使用它的方式:

    new KAsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            Toast.makeText(context, "Connecting to Server...", Toast.LENGTH_LONG).show();
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            //super.onPostExecute(result);
            Toast.makeText(context, "Responce Recieved.", Toast.LENGTH_LONG).show();
        }

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

            //Do webservice calls in here

            return null;
        }

    }.setContext(this).execute();

我需要上下文从任务本身向用户显示消息。

此致 EZFrag

答案 2 :(得分:2)

如果我正确理解您的问题,您正在寻找一种方法来实例化一个匿名内部AsyncTask ,它也有一个实例变量。您打算如何将该附加值传递给AsyncTask

AFAIK,Java不允许您覆盖匿名内部类的构造函数。因此,您唯一的希望是传递Context作为Params类型的一部分(恰好是Varargs)。这意味着您必须将Params类型设为Context;或使用Stringserialize / Parcel Context作为String。老实说,我觉得这不值得付出努力,而且太过分了。

您是否有理由使用匿名 AsyncTask?我建议你创建一个AsyncTask的命名实现。