2012-01-25 4 views
5

Я пытаюсь подклассифицировать класс android.os.AsyncTask в общем случае. Я просто хочу добавить к нему свойство. Дело в том, что я все еще хочу использовать его как анонимный класс.Java: Subclassing AsyncTask

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

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

    } 

Я пробовал подклассифицировать его, но я просто не могу обернуть его вокруг головы, как я должен это делать.

С уважением, EZFrag

+0

Вы могли бы хотеть взглянуть на этот пример http://www.etosis.com/posts/asynctask-helpers –

ответ

16

Вы имеете в виду, вы все еще хотите, чтобы это абстрактный класс шаблона, как AsyncTask? Объявление будет:

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

} 
+0

Спасибо Рувим, что работал. Я приму ваш ответ завтра ... Я хочу поделиться тем, что я сделал ниже. – EZFrag

2

Если я правильно понимаю ваш вопрос, вы ищете способ создать экземпляр анонимный внутренний AsyncTask который также имеет переменную экземпляра. Как вы планируете передать это дополнительное значение в AsyncTask?

AFAIK, Java не позволяет переопределить конструктор анонимного внутреннего класса. Поэтому ваша единственная надежда состоит в том, чтобы пройти в Context как часть типа Params (который, случается, является Varargs). Это означает, что вы должны указать тип Params как Context; или используйте String и serialize/ParcelContext как String. Я честно чувствую, что это не стоит усилий и слишком много взлома.

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

+0

+1, это правильный способ подумать о проблеме ИМО. – Guillaume

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

+1

Возможно, вы также использовали YourActivityName.this из вашего анонимного AsynkTask, без подкласса. –