2013-08-09 4 views
0

Я пытаюсь получить данные json из дампа (который является картой). Итак, Идея - это когда действие запускается фоновым потоком, читая данные Json и дамп. Теперь выполняется поток пользовательских интерфейсов, и ArrayList должен обновляться из данных дампа.Выполнение потока обработчика перед потоком пользовательского интерфейса

Моего код

Public class myclass extends ListActivity{ 

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

    MyHandlerMethod(); 
ArrayList deals = new ArrayList(SessionStore.getFromDump("someData")); 
} 

MyHandlerMethod(){ 

//A handler thread 
//Json parsing and adding data to dump runs here 
} 

} 

// Sessionstore класс имеет getFromDump() метод, которые карта внутри для хранения данных.

// Когда MyHandlerMethod запускается, эта карта должна быть обновлена.

Но я каждый раз, когда поток пользовательского интерфейса работает до MyHandlerMethod(), поэтому SessionStore.getFromDump ("someData") остается нулевым.

Как я могу заверить запустить поток обработчика до потока пользовательского интерфейса.

Его список деятельности. На самом деле я хочу, чтобы arraylist обновлялся с дампа, и я использую этот список массивов для активности списка.

+0

Ну, поток вызывается из основного потока (основной пользовательский интерфейс), поэтому вы не можете запускать его до этого, однако вы можете дождаться завершения фонового потока, а затем отобразить, таким образом, вы не получите нулевой 'SessionStore.getFromDump ("someData")'. – g00dy

ответ

3

Для этого необходимо использовать AsyncTask и обновить свой интерфейс с помощью методов onProgressUpdate/publishProgress и onPostExecute.

http://developer.android.com/reference/android/os/AsyncTask.html

Вот пример того, как она могла бы работать:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 

    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); // here you can for example update your progress bar, your textviews, whatever UI... 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
+0

Надеюсь, этот ответ достаточно ясен для вас. В противном случае, не стесняйтесь обращаться за подробной информацией. –

+0

Как asyncTask будет обновлять данные дампа до того, как ArrayList в потоке пользовательского интерфейса будет выполнен. Это то же самое, что и обработчик. –

+0

Просто инициализируйте свой ArrayList при создании Activity, а затем добавьте элементы в ArrayList в onProgressUpdate или onPostExecute Method. –

1

Вы должны использовать AsyncTask для получения данных данных, а затем обновить поток пользовательского интерфейса. Here the reference.

1

В основном вы не можете запустить HandlerThread перед потоком пользовательского интерфейса. Но вы можете подождать, когда фоновая задача загрузит изображения, показывая, например, ProgressDialog. Я рекомендую вам использовать AsyncTask.

Это хороший учебник о фоновых процессах, в том числе AsyncTask.

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

0

Если вы не хотите или не можете использовать AsyncTask, может быть, вы хотите, чтобы указать Thread приоритет или любой другой.

Вы можете начать HandlerThread затем вызвать getLooper(), чтобы получить его Looper, которые затем можно перейти к Handler, так что он может принимать и обрабатывать сообщения в этой теме.

Но использование AsyncTask - это простое решение.

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