2011-05-14 60 views
5

我想開一個新的活動:開始新的Android的活動是如此緩慢

Intent intent = new Intent(homeScreen.this, EmployeeService.class);   
Bundle b = new Bundle(); 
b.putInt(Constants.SERVICE_DETAIL_L1_ID_MSG, ServiceIndex.SRV_L1_EMPLOYMENT); 
b.putInt(Constants.SERVICE_DETAIL_FOCUS_POS_MSG, 2); 
intent.putExtras(b); 
startActivity(intent); 

但需要很長時間,使目的地活動(的EmployeeService)變得可見。從Logcat,我看到:

05-14 23:43:31.727: INFO/ActivityManager(59): Displayed activity fr.playsoft.happylille/.employee.EmployeeService: 7050 ms (total 7050 ms) 

我不能相信它需要超過7秒才能打開一個新的活動。我在onCreate()中添加一個日誌,但看到它只需要5ms就可以完成onCreate。

誰能告訴我如何找到這個問題的根源?

+0

OK執行Html.fromHtml(desc)。我知道爲什麼。因爲在目標Activity中,我設置了tvDesc.setText(Html.fromHtml(desc)); desc是帶有HTML標籤的長頁面的內容。使用可能不支持的標籤處理HTML頁面使我的活動緩慢顯示! – anticafe 2011-05-14 17:51:36

+0

您可以將處理放在單獨的線程中。 – olafure 2011-05-14 19:28:16

+0

@Olafure:這真是個好主意。現在它運作良好。 – anticafe 2011-05-15 03:35:42

回答

3

您應該將代碼Html.fromHtml(desc);移至線程以使其異步。此線程可以在新開放的ActivityonCreate()期間安全啓動。

在該線程結束後,你可以運行從UI線程tvDesc.setText()

class ExampleThread extends Thread { 
    @Override 
    public void run() { 
     final Spanned spannedText = Html.fromHtml(desc); 

     yourNewlyOpenedActivity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        tvDesc.setText(spannedText); 
       } 
     }); 
    } 
} 

更一般地,在設備上7秒也許意味着另一個20,所以beware the ANR

(進一步編輯下面Boy的評論,這個答案的前版本已不再準確/有效)

+0

我不相信你可以在非UI線程上執行'setText' – Boy 2016-03-17 09:46:46

+0

@Boy當我寫這篇文章的時候,我在API級別8上。它工作正常,但從那以後我沒有重新測試過)。所以我不能保證這個依然有效,你試過了嗎? – Shlublu 2016-03-17 09:52:33

+0

我沒有重新測試,因爲我非常確定。但我只是做了,並會發佈一個新的答案,文本將在這裏太長 – Boy 2016-03-17 10:06:15

0

將您打開的新活動代碼放入主題中。並運行代碼可能需要更少的時間來打開另一個活動..可能會有幫助。

1

Shlublu's answer不正確,你不能從非UI線程做UI更新!

它似乎起初工作,但這只是運氣,時機。

只是一個快速醜陋的測試證明它會在'正確'的時機出錯。這裏我每隔100毫秒設置一個文本。會崩潰在約1秒:

 new Thread() { 

     @Override 
     public void run() { 
      while (true) { 
       someTextView.setText("bla"); 

       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }.start(); 

它會拋出這個錯誤:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我想你應該通過AsyncTaskRxJava