Scala Android AsyncTask не будет вызывать функцию обратного вызова publishProgress "onProgressUpdate" - PullRequest
4 голосов
/ 23 октября 2011

Я потратил слишком много часов на это и до сих пор продолжаю жить без функции publishProgress () ... к счастью, onPostExecute также работает в потоке пользовательского интерфейса, поэтому мне пришлось создавать N потоков для каждого изображения, которое я хочу загрузить вместо одного большого потока, который должен был обновить просмотр списка. Так что не смертельно, а настоящее раздражение.

Прежде всего, большое спасибо этим страницам за предоставление более глубокого понимания и способов [ссылки 2!] Иметь чистую реализацию Scala ...

(1) http://blog.nelsonsilva.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask, который является обходным путем для: Issues.scala-lang.org просмотра SI-1459 (Новые пользователи ограничены 2 ссылками)

(2) va.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask, который является обходным решением для: ЖЕ КАК ВЫШЕ

(3) http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/docs/android-examples/android-sdk/Wiktionary/src/com/example/android/wiktionary/MyAsyncTask.java?rev=f2fdb3144d0225487cafc7d628adf64889772db4

К сожалению, ни один из них, похоже, не работал для меня на Scala 2.8.1 с Android 2.2.2 под управлением Android-x86 на Virtual Box, Ubuntu 11.04.

Вот мой реальный код, мусор удален, только самое необходимое ... если кто-нибудь может сказать мне, как вызвать обратный вызов, я буду очень счастлив, и это даже не Рождество. Я потратил часы на это и не могу заставить его работать вообще, я пробовал все варианты типа "Progress", поскольку использование AnyRef на самом деле работает, но любой другой тип не работает как тип "Params", см. ( 2) выше для деталей об этом.

Увы, я получаю preExecute (не показано), doInBackground и postExecute, но никаких обратных вызовов хода выполнения не видно. (

код ...

private class FeedLoaderTask(val activity: ActivityFeedReader) 
  extends android.os.AsyncTask[AnyRef, Seq[FeedEntry], Seq[FeedEntry]]
{
  /** @brief dialog to show our progress */
  private var dlgBusy:ProgressDialog = null;


  override def onPreExecute() {
    dlgBusy = ProgressDialog.show(...)
  }

  override protected def doInBackground(params: AnyRef*): Seq[FeedEntry] = {
    // resorted to AnyRef for reasons explained above although
    val url = params.apply(0).asInstanceOf[String]
    log.d("FeedLoaderTask: doInBackground: " + url)
    val feeds = new FeedReader(url).extract
    log.d("Got them, total: " + feeds.length)
    publishProgress()//feeds) // <--- seems to "call" but does not arrive
    feeds
  }

  protected def onProgressUpdate(feeds: Seq[FeedEntry]): Void = {
    // work damn you, WORK!
    log.d("FeedLoaderTask: onProgressUpdate: " + feeds.length)
    return null
  }

  override protected def onPostExecute (feeds: Seq[FeedEntry]) {
    dlgBusy.dismiss()
    dlgBusy = null
    feeds.length match {
    case 0 => messageAndTerminate(R.string.rss_failed_msg)
    case _ =>
      listAdapter = new FeedListAdapter(...)
      activity.setListAdapter(listAdapter)
      ...blah blah more code...
   }
  }
}

Итак, у меня есть обходной путь (возможно, даже лучший способ) делать то, что я хочу, но я ненавижу не иметь возможности делать то, что я хочу.

Это было бы неплохо, чтобы было решено, так как его избили ... Это мое первое приложение для Android, и я почти однажды закончил его на Java, но мне так охренеть, что я набрал текст и бесполезность, которую я начал с нуля и одновременно научил себя Скале. Я знаю Erlang, LISP и Haskell, так что это помогло. Все, что я могу сказать, это «УЗНАЙТЕ СКАЛА СЕЙЧАС!» ... поддержка XML великолепна, мой оригинальный код синтаксического анализа RSS (четыре класса!) Теперь находится в одном файле и содержит около 80 строк кода, используя XML API для поиска элементов , извлечение атрибутов и т. д.

Всего наилучшего, :)

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

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

определение класса как

class FeedLoaderTask(val activity: ActivityFeedReader)
  extends AsyncTask[AnyRef, AnyRef, Seq[FeedEntry]]

и мой onProgressUpdate как:

override def onProgressUpdate(params: AnyRef*) {
  val feeds = params(0).asInstanceOf[Seq[FeedEnty]]
  ...
}

Как видите, он аналогичен методу doInBackground () (обратите внимание, что вам не обязательно явно вызывать apply () в Scala, а методам void не нужно объявлять тип возврата и "=") .

0 голосов
/ 06 апреля 2013

Полезно сделать преобразование между аргументами и .... Создав новый класс Java, который смешивает оба, я мог бы добиться результата:

import scala.collection.mutable.ArrayBuffer;
import android.os.AsyncTask;

public abstract class MyAsyncTask<U, V, W> extends AsyncTask<U, V, W> {

    @Override
    protected W doInBackground(U ... args) {
        int count = args.length;
        ArrayBuffer<U> res = new ArrayBuffer<U>(count);
        for (int i = 0; i < count; i++) {
          res.$plus$eq(args[i]);
        }
        return doInBackground1(res);
    }

    // Method to override in the scala file
    protected abstract W doInBackground1(ArrayBuffer<U> args);

    ArrayBuffer<V> res = new ArrayBuffer<V>();

    @Override
    protected void onProgressUpdate(V ... args) {
      int count = args.length;
      res.ensureSize(count);
      res.clear();

      ArrayBuffer<V> res = new ArrayBuffer<V>(count);
      for (int i = 0; i < count; i++) {
        res.$plus$eq(args[i]);
      }
      onProgressUpdate1(res);
   }

   // Method to override in the scala file
   protected abstract void onProgressUpdate1(ArrayBuffer<V> args);
}
0 голосов
/ 03 ноября 2011

защищенное переопределение def onProgressUpdate (progress: Seq [FeedEntry] *) {}

Возможно, вы хотите указать AsyncTask как AsyncTask [AnyRef, FeedEntry, Seq [FeedEntry]]

ИтакВы можете сделать

защищенное переопределение def onProgressUpdate (feeds: FeedEntry *)

вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...