2012-12-24 85 views
2

我遇到問題,我做了一個簡單的應用程序來向您顯示我的問題。 我希望setContentView在執行睡眠之前執行並顯示.xml。我認爲一切都會按順序執行? 有沒有人可以說我爲什麼不這樣做?setContentView執行太遲

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     // do something 
    } 

非常感謝!

編輯:

這裏是真正的OnCreate,似乎是一個更大的問題。

所有與睡眠工作正常,但與連接方法有問題。

公共無效的onCreate(捆綁savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

ConnectBluetooth(); 

} 

在ConnectBluetooth()方法,我只需要創建一個新的Socket,並嘗試連接。

使用ned線程或處理程序它似乎不工作,那麼我應該怎麼做?使用類似asynctask的東西?

非常感謝!

+1

IMO'睡眠(...)'在任何編程語言中的黑客在任何平臺上,但如果你在Android中使用它(特別是在主/ UI線程中),你確實會遇到麻煩。 – Squonk

回答

1

當您撥打sleep時,您正在暫停UI線程。這將阻止onCreate返回,這將阻止框架完成活動的初始化,包括顯示視圖層次結構。

你不應該像這樣暫停UI線程。如果你想在10秒後做一些事情,你可以啓動一個單獨的線程,會做它在正確的時間:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new Thread() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(10000); 
       doSomething(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 

一個更簡潔的方法是使用一個Handler

Handler mHandler; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mHandler = new Handler(); 
    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      doSomething(); 
     } 
    }, 10000); 
} 
+0

「你永遠不應該像這樣暫停UI線程。」單獨爲這句話贊成,但也有相同的基本答案。 – Sam

+0

非常感謝!我的問題是,我不知道,那個創建者必須完成對這個xml的內容的顯示! 我只用這個睡眠小程序向你展示了我的意思,我的程序有一個藍牙連接來打電話,這需要一些時間,但我不想發佈這個長時間的程序。 – user1927295

+0

@ user1927295 - 進行藍牙呼叫,進行網絡活動 - 甚至訪問設備上的文件系統 - 應該在UI線程之外完成。在最近的Android版本中,試圖在UI線程上執行網絡活動會引發異常。 –

2

的在調用onResume()之後,直到創建過程完成後纔會顯示佈局。但是,在佈局顯示時沒有回調,但可以使用Handler和Runnable來執行此操作。


創建幾個字段變量:

Handler handler = new Handler(); 
Runnable delay = new Runnable() { 
    @Override 
    public void run() { 
     // Do something 
    } 
}; 

而且onCreate()電話:

handler.postDelayed(delay, 10000); 
+0

100?那應該不是10000? ;) – Squonk

+1

是的。一時之間,我對OP正在嘗試做什麼感到困惑。 – Sam