2017-04-17 111 views
0

我有同時實現異步任務的一些問題。我想在特定的時間內的活動運行的後臺任務(15分鐘,但爲了調試的目的,我使用10秒)。處理程序凍結GUI的Android

我的代碼:

final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      ApplicationData.LoadApplicationData(getApplicationContext()); //Like SystemClock.sleep(2000) 
     } 
     catch (Exception e) 
     { 
      Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show(); 
     } 
     try{ 
      Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragmentcontent); 
      if(currentFragment != null) { 
       FragmentTransaction fragTransaction = getSupportFragmentManager().beginTransaction(); 
       fragTransaction.detach(currentFragment); 
       fragTransaction.attach(currentFragment); 
       fragTransaction.commit(); 
       Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT).show(); 
      } 
     } 
     catch (Exception e) { 
     } 
     finally{ 
      handler.postDelayed(this, 10000); //900000 
     } 
    } 
},10000); 

此代碼凍結2-4秒鐘可以應用。 ApplicationData.LoadApplicationData從服務器加載數據並花費時間。在我的第一次嘗試中,我創建了一個線程,以便這個工作異步完成,但之後我無法更新我的片段。

我怎麼能更新背景資料,一旦完成更新GUI?

+0

使用的AsyncTask從服務器加載... – Opiatefuchs

+0

也許你應該考慮使用後臺服務或多線程 – PeMaCN

+0

ApplicationData.LoadApplicationData是可調用的列表,以使它異步運行,但我需要等待他們完成。只有在他們全部完成後,我才能更新GUI。 – Exprove

回答

0
new Thread(new Runnable() { 

       @Override 
       public void run() { 
       ApplicationData.LoadApplicationData(getApplicationContext());//background thread code 
        runOnUiThread(new Runnable() { 
         public void run() { 
          //the other foreground thread 
         } 
        }); 
       } 

    }).start(); 
+0

@azizbekian是的,但用戶界面不會被阻塞 – Vyacheslav

+0

不知道如何可以實現這個代碼的循環?必須在15分鐘內運行。時間和睡眠可靠嗎? – Exprove

+0

@Exprove,使用AlarmManager收取一些事件很長一段時間。 – Vyacheslav