2012-04-25 2 views
1

У меня есть метод onCreate, который запускает код ниже. В двух словах код извлекает данные с сервера и показывает его на экране для программы обмена сообщениями. Это происходит только один раз, но я хотел бы, чтобы он запускал AsyncTask каждые 3 секунды (чтобы попытаться смоделировать чат). Я почти уверен, что это не способ иметь чат-систему, но мне просто нужно что-то, что работает сейчас (как доказательство концепции), и я сосредоточусь на правильном способе его реализации позже.Как снова и снова запускать AsyncTask?

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.chat_box);// sd 

     final Functions function = new Functions(); 
     final SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(getBaseContext()); 
     whatroom = prefs.getString("chat", "null"); 

     new AsyncTask<String, Void, String>() { 
      @Override 
      protected String doInBackground(String... args) { 
       return function.getInbox(args[0]); 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       TextView inbox = (TextView) findViewById(R.id.inbox); 
       ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
       progressBar.setVisibility(View.GONE); 
       inbox.setText(result); 
      } 

     }.execute(whatroom); 
    } 

Я пробовал ставить простую инструкцию while вокруг асинтезы, но она просто заставляет закрывать.

+0

В чем вопрос? –

+1

Обычно мы не используем AsyncTask для периодической задачи, проверьте мой ответ [здесь] (http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or- обработчик/8102488 # 8102488), чтобы узнать, помогает ли это. – yorkw

+0

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

ответ

2

Вы не можете повторно использовать AsyncTask экземпляр. Вам нужно будет создавать свежие экземпляры каждого прохода вашего цикла.

+0

Должен ли я пытаться создать новый экземпляр, или я должен пойти другим путем (например, загрузчики, упомянутые @Steve)? – EGHDK

+0

@EGHDK: Для меня это не похоже на сценарий «Loader». Вы можете использовать 'Timer' и' TimerTask', плюс 'post()' в вашем 'TextView', чтобы эти обновления появлялись в основном потоке приложения, а не в потоке задачи. – CommonsWare

+0

Так что если кто-нибудь найдет это в будущем. CommonsWare дал ответ на вопрос, но Йорк дал мне решение. Спасибо всем за ваше время. Я ценю это. – EGHDK

0

Без дополнительной информации сложно дать вам конкретный ответ. Однако заглянуть в абстрагировании все, используя в Loader, используя Service и т.д.

Что касается Loaders:

  • Они доступны для каждого вида деятельности и фрагмента.
  • Они обеспечивают асинхронную загрузку данных.
  • Они отслеживают источник своих данных и предоставляют новые результаты при изменении содержимого.
  • Они автоматически соединяются с указателем последнего загрузчика при воссоздании после изменения конфигурации. Таким образом, им не нужно повторно запрашивать свои данные.
+0

AsyncTask просто запускает функцию 'getInbox()', которая получает информацию из Интернета, используя скрипт php. Будет ли загрузчик правильным для использования? – EGHDK

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