【问题标题】:Java : Subclassing AsyncTaskJava:子类化 AsyncTask
【发布时间】:2012-01-25 11:10:52
【问题描述】:

我正在尝试对 android.os.AsyncTask 类进行一般子类化。我基本上只是想向它添加一个属性。问题是,我仍然希望能够将其用作匿名类。

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

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

    }

我已经尝试对它进行子类化,但我无法理解我应该如何做到这一点。

问候, EZFrag

【问题讨论】:

标签: java android android-asynctask


【解决方案1】:

你的意思是你仍然希望它是像 AsyncTask 这样的抽象模板类?声明将是:

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

}

【讨论】:

  • 感谢鲁本,这很有效。明天我会接受你的回答...我想在下面分享我所做的。
【解决方案2】:

感谢鲁本,它按预期工作 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

【讨论】:

  • 您也可以使用匿名 AsynkTask 中的 YourActivityName.this,无需子类化。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多