Обновление потока пользовательского интерфейса из AsyncTask в открытом классе

Я пытаюсь отделить некоторые классы AsyncTask с публичными (отдельными) функциями, чтобы мне не пришлось переписывать столько кода. У меня почти есть это, за исключением одного очень важного аспекта. Функция AsyncTask компилирует ArrayList, делая php-вызовы на сервер. Когда этот список будет завершен, мне нужно обновить счетчик в основном потоке пользовательского интерфейса. Я нашел здесь действительно хороший ответ, но у меня есть немного трудностей, чтобы заставить его работать.

Вот уменьшенная версия того, что у меня есть: (обратите внимание, что на данный момент все, что я пытаюсь сделать, это позвонить в сообщение Toast чтобы доказать, что поездка туда и обратно работает)

Вот вызывающая Activity :

 public class MyActivity extends Activity implements OnTaskCompleted { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sg_list = new ArrayList<String>(); new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...").execute(); } public void onTaskCompleted(ArrayList<String> list) { Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show(); } } 

Это интерфейс:

 public interface OnTaskCompleted { void onTaskCompleted(ArrayList<String> list); } 

И, наконец, вот AsyncTask . Обратите внимание, что это класс Public:

 public class GetSuperGroups extends AsyncTask<String, String, ArrayList<String>> { private Activity activity; private Context context; private String progressMsg; private ProgressDialog pDialog; private ArrayList<String> sg_list; private OnTaskCompleted listener; public GetSuperGroups(Activity activity, Context context, String progressMsg) { this.activity = activity; this.context = context; this.progressMsg = progressMsg; } public void setSuperGroupList (OnTaskCompleted listener){ this.listener = listener; } @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(context); pDialog.setMessage(progressMsg); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected ArrayList<String> doInBackground(String... args) { sg_list = new ArrayList<String>(); //make a php call, compile the ArrayList return sg_list; } protected void onPostExecute(ArrayList<String> sg_list) { pDialog.dismiss(); //this next line causes a null pointer error //note that I am throwing away the array list for now //all I want to do is prove that I can call the Toast back in the calling Activity listener.onTaskCompleted(new ArrayList<String>()); } } 

Просто добавьте параметр OnTaskCompleted listener в свой constructor GetSuperGroups . Затем передайте this при выполнении asyncTask .

 public class MyActivity extends Activity implements OnTaskCompleted { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sg_list = new ArrayList<String>(); new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...", this).execute(); } public void onTaskCompleted(ArrayList<String> list) { Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show(); } } 

а также

  public class GetSuperGroups extends AsyncTask<String, String, ArrayList<String>> { private Activity activity; private Context context; private String progressMsg; private ProgressDialog pDialog; private ArrayList<String> sg_list; private OnTaskCompleted listener; public GetSuperGroups(Activity activity, Context context, String progressMsg, OnTaskCompleted listener) { this.activity = activity; this.context = context; this.progressMsg = progressMsg; this.listener = listener; } 

Вы никогда не вызываете setSuperGroupList() чтобы listener оставался пустым. Лучше поставить слушателя в конструктор вашей задачи.

Вы подбираете правильный путь. Но я не понимаю проблему в методе onPostExecute (..). Это о нулевом pDialog или null sg_list. Если проблема в sg_list, пожалуйста, проверьте, работает ли php-метод или нет? Может возникнуть проблема с разрешением в файле foe php-файла манифеста.
Поэтому мой совет сначала проверить ваш метод на потоке пользовательского интерфейса. Затем измените его на фоновый поток.
Также вы можете поместить тост в метод onPostExecute, чтобы проверить содержимое sg_list.

Вам нужно добавить функцию setListener:

 public class TaskComplete { public OnTaskCompleted onTaskListenerComplete; public interface OnTaskCompleted { void onTaskCompleted(ArrayList<String> list); } public void setOnTaskComplete(OnTaskCompleted onTaskListenerComplete){ this.onTaskListenerComplete = onTaskListenerComplete; } } 

И в Управлении определите и установите:

 public class MyActivity extends Activity implements OnTaskCompleted { public TaskComplete task; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sg_list = new ArrayList<String>(); task.setOnTaskComplete(this); new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...").execute(); } public void onTaskCompleted(ArrayList<String> list) { Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show(); } } 

В AsyncTask:

 protected void onPostExecute(ArrayList<String> sg_list) { pDialog.dismiss(); //this next line causes a null pointer error //note that I am throwing away the array list for now //all I want to do is prove that I can call the Toast back in the calling Activity activity.onTaskCompleted(new ArrayList<String>()); } 

Надеюсь, это полезно.

Intereting Posts
Диапазон оценки прогноза Android Gesture GetResources (). GetColor () устарел PagerSlidingTabStrip – добавить новую вкладку во время выполнения Как интегрировать paypal пожертвовать в Android-приложение? Память zip-файла с памятью в Java Flurry Analytics для Android: данные не отправляются на панель управления Flurry? Как добавить панель действий из библиотеки поддержки в PreferenceActivity? Android – динамические кнопки ListView для каждой строки, вызывающей динамические прослушиватели Ошибка IAB для Android – требуется проверка подлинности Открыть URL-адрес от маркера, Android Google Maps V2 Устанавливать и запускать приложение на нескольких устройствах одним щелчком мыши по eclipse Добавление линейного макета в навигационный ящик (заканчивается с ошибкой ClassCastException) Выберите случайный или urandom в качестве источника для SecureRandom в Android Код разблокировки лица в Android-проекте с открытым исходным кодом? Курсор EditText не отображается в Android 3.0