2017-04-17 76 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