2013-04-04 3 views
1

У меня есть асинхронной задачи с doInBackground() способом, как это:Опубликовать прогресс из внешнего класса во время Async Task?

 protected String doInBackground(String... params) { 
      MyClass session = new MyClass("email", "password"); 
      return session.isAuthorized(); 
     } 

Хотя MyClass, который находится в укомплектовать другом пакете, это что-то вроде этого:

 private class MyClass { 
        // fields, constructors, etc 
        public Boolean isAuthorized() { 
          // some stuff 
          log("Action 1..."); 
          // some stuff 
          log("Action 2..."); 
          // some other stuff 
          return result; 
        } 

        public static void log(String str) { 
          // HERE I would like to publish progress in the Async Task 
          // but, until now, it's kinda like: 
          System.out.println(str); 
        } 
     } 

Возникает вопрос: как может Я передаю описания журналов в методе log(), внешние, даже для основного «Контейнера активности», до publishProgress()? Я уже читал эту тему: Difficulty in changing the message of progress dialog in async task - но это не был действительный источник помощи, так как мой метод не содержится в основном классе public class MainActivity extends Activity {}.

EDIT # 1 -

После некоторой работы, я понял, что единственный путь есть переход к внешнему классу в Referece к «основной» поток, а затем реализовать конкретный способ публикации прогресса. Таким образом:

 public void log(String str) { 
        if (mThreadReference==null) { 
          System.out.println(str); 
        } else { 
          mThreadReference.doProgress(); 
        } 
     } 

В то время как mThreadReference указывает на эту AsyncTask:

private class MyClassTask extends AsyncTask<String,String,String> { 
     @Override 
     protected String doInBackground(String... params) { 
      // constructs MyClass instance with a reference and run main method 
      (new MyClass("email", "password", this)).isAuthorized(); 
     } 

     public void doProgress(String str) { 
      publishProgress(str); 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      // some stuff 
     } 
     @Override 
     protected void onPostExecute(String result) { 
     } 
    } 

Но, очевидно, Eclipse предупреждает меня: The method publishProgress() is undefined for the type Activity. Как я могу написать общий и метод во внешнем классе, который я могу использовать в более чем одном конкретном AsyncThread?

      --> LOGs IN THE LOGIN THREAD 1 
         /
      EXTERNAL CLASS ---> LOGs IN THE LOGIN THREAD 2 
          \ 
          --> LOGs IN THE LOGIN THREAD 3 

ответ

2

Я понял, что единственный путь импорта istance из AsyncTask, который должен быть публичным (не опция по умолчанию!), В основной деятельности. С помощью этого трюка я могу вызвать метод publishProgress, даже если он защищен.

// MyClass, in a different package 

    import MainActivity.MyClassTask mThreadReference = null; 

    // some stuff... 

    public void log(String str) { 
      if (mThreadReference==null) { 
        System.out.println(str); 
      } else { 
        mThreadReference.doProgress(""); 
      } 
    } 

Хотя это активность:

public class LoginLanding extends Activity { 

    // stuff... 

    public class MyClassTask extends AsyncTask<String,String,String> { 
      // bla bla bla, some stuff... 

      public void doProgress(String str) { 
        // do something 
      } 
    } 
} 
0

Сегодня я столкнулся с подобной проблемой. Предыдущий ответ помог решить проблему 50%. Это было исключение null-указателя, так как mThreadReference имеет значение null.

Теперь вам нужен экземпляр охватывающего класса, чтобы создать экземпляр внутреннего класса, который является классом AsyncTask. Поскольку я такой класс определяется внутри моего фрагмента, что я сделал ниже:

MyFragment fm = new MyFragment(); 
    MyFragment.AsyncTaskClassName aTCN = fm.new AsyncTaskClassName(); 

После этого вы можете вызвать метод doProgress путь Gianlunca уже предложили.

Мои 2 цента!

Смежные вопросы