2016-06-01 3 views
0

Я хочу позвонить adapter.notifyDataSetChanged() из другого потока. Я прочитал, что должен использовать AsyncTask и выполнить adapter.notifyDataSetChanged() при выполнении post.Call adapter.notifyDataSetChanged() из другого потока

Я должен выполнить AsyncTask каждые 5 секунд только для текущей активности (может быть родительской или дочерней), потому что только одно действие может выполнять асинтезу одновременно.

Должен ли я создать , который выполняет AsyncTask каждые 5 секунд, остановите его, когда я начну выполнять другое действие и запустите его обратно в onResume?

Вот мой код для темы, которая обновляет ListView текущей деятельности.

private void runEventHandler() { 
    new Thread() { 
     public void run() { 
      while (true) { 
       try { 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          users.add(new User(10, "a", false)); 
          adapter.notifyDataSetChanged(); 
         } 
        }); 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }.start(); 
} 

Теперь я должен быть в состоянии обновить дочерние виды деятельности ListViews при добавлении нового пользователя.

+1

вы можете использовать runOnUiThread.for более подробную информацию смотрите http://stackoverflow.com/questions/11140285/how-to-use-runonuithread – pooyan

+0

Он работает хорошо, но он продолжает работать, когда я запускаю дочернюю активность. Как я могу остановить его, а затем перезапустить? Или, если возможно, могу ли я обновить дочерние действия из потока? – Servietsky

+1

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

ответ

1

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

Activity A 
{ 
public static boolean stopThread = false; 
    @Override 
    public void onResume() 
    { 
    super.onResume(); 
    // put your code here... 
    stopThread =false; 
    runEventHandler(); 
    } 
private void runEventHandler() { 
new Thread() { 
    public void run() { 
     while (A.stopThread != false) { 
      try { 
       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         users.add(new User(10, "a", false)); 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}.start(); 
} 


    @Override 
protected void onStop(){ 
    super.onStop(); 
    stopThread =true; 
    } 

} 



Activity B 
{ 
public static boolean stopThread = false; 
    @Override 
    public void onResume() 
    { 
    super.onResume(); 
    // put your code here... 
    stopThread =false; 
    runEventHandler(); 
    } 
private void runEventHandler() { 
new Thread() { 
    public void run() { 
     while (B.stopThread != false) { 
      try { 
       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         users.add(new User(10, "a", false)); 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}.start(); 
} 


    @Override 
protected void onStop(){ 
    super.onStop(); 
    stopThread =true; 
    } 

} 

также вы можете использовать onPause() вместо onStop(). зависит от вашей концепции программы.

+0

Спасибо, я думаю, что буду использовать это. Однако вы не думаете, что есть более чистый способ, чем создать поток в каждом мероприятии, которое потребует обновлений? – Servietsky

+0

есть другой способ, который вы можете сделать ваши адаптеры статичными, и вы вызываете «notifyDataSetChanged» из службы, которая запускается в фоновом режиме. – pooyan

1

Вы должны TimerTask как в ссылке ниже: https://examples.javacodegeeks.com/android/core/activity/android-timertask-example/

код, чтобы получить возможность отправлять какие-либо изменения на UIThread, если вы находитесь в другом потоке, как doInBackground из AsyncTask:

runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           // Here you can set your Ui Components 
          } 
         }); 
Смежные вопросы