2011-08-12 30 views
16

Tôi đang cố gắng tạo một luồng mới trong onCreate() của một hoạt động, nhưng thay vì tạo một luồng mới và thực thi mã của runnable trong đó, mã runnable đang thực thi trong chủ đề chính của chương trình của tôi. Một chủ đề mới dường như không bao giờ được tạo ra.Android: Chủ đề mới Runnable Thực hiện trong Chủ đề chính

Các onCreate() code:

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.monster_layout); 
    runningMonsterViewActivity = this; 
    Thread.currentThread().setName("Main Thread"); 
    Log.v(TAG, "onCreate() has run"); 
    Thread genThread = new Thread(new TestRunnable()); 
    genThread.run(); 
} 

Mã Runnable:

import android.os.Handler; 
import android.util.Log; 

public class TestRunnable implements Runnable{ 
String TAG = "TestRunnable"; 

    public TestRunnable() 
    { 
    // mainThreadHandler = h; 
    } 
    @Override 
    public void run() { 
     for(int i=0; i < 1000; i++){ 
      Log.v(TAG, new Integer(i).toString()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

Các vết đống tôi khi tôi dừng lại mã khi nó được thực hiện:

DalvikVM[localhost:8621] (Suspended)  
    Thread [<1> Main Thread] (Suspended)  
     VMThread.sleep(long, int) line: not available [native method] 
     Thread.sleep(long, int) line: 1306 
     Thread.sleep(long) line: 1286 
     TestRunnable.run() line: 18 
     Thread.run() line: 1096 
     MonsterViewActivity.onCreate(Bundle) line: 49 
     Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047 
     ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2627 
     ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2679 
     ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 125 
     ActivityThread$H.handleMessage(Message) line: 2033 
     ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
     Looper.loop() line: 123 
     ActivityThread.main(String[]) line: 4627  
     Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
     Method.invoke(Object, Object...) line: 521 
     ZygoteInit$MethodAndArgsCaller.run() line: 868 
     ZygoteInit.main(String[]) line: 626 
     NativeStart.main(String[]) line: not available [native method] 
    Thread [<6> Binder Thread #2] (Suspended) 
    Thread [<5> Binder Thread #1] (Suspended) 
    Daemon System Thread [<3> Signal Catcher] (Suspended) 
    Daemon System Thread [<2> HeapWorker] (Suspended) 
+0

Chủ đề [<5> Chủ đề kết nối # 1] (Tạm dừng) là gì? – Jack

+0

Jack Tôi không biết tại sao nó lại nói "Chủ đề [<5> Binder Thread # 1] (Suspended)". Tôi đoán rằng tôi đã vô tình tạm dừng chủ đề đó khi tôi đang sao chép dấu vết ngăn xếp. Nó không thực sự mater, câu hỏi của tôi đã được trả lời tất cả như nhau. Cảm ơn mặc dù! – HappyCoder86

Trả lời

37

Bạn chỉ cần thay đổi genThread.run(); thành genThread.start();

Ngay bây giờ, mã của bạn gọi phương thức run() từ chuỗi chính. start() thực sự sẽ bắt đầu một chuỗi mới và sẽ thực thi phương thức run() trên chủ đề, đó là hành vi mong muốn.

+0

Điều đó có ý nghĩa rất nhiều. Cảm ơn bạn rất nhiều! – HappyCoder86

+3

Incredible .. Tôi quên sử dụng start() thay vì run() (Tôi đã mất khoảng 4 giờ). ;) –

+2

ive đã sử dụng java trong 8 năm và chỉ được thực hiện bằng cách này, làm thế nào ngu ngốc! +1 – Dori

0

Bạn chỉ cần sử dụng đoạn mã này.

new Thread(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     //background task? 
    } 

}).start(); 
Các vấn đề liên quan