【问题标题】:Android: New Thread Runnable Executes in Main ThreadAndroid:新线程可运行在主线程中执行
【发布时间】:2023-03-05 12:29:02
【问题描述】:

我试图在活动的 onCreate() 中创建一个新线程,但不是创建一个新线程并在其中执行可运行的代码,而是在我的程序的主线程中执行可运行的代码。似乎永远不会创建新线程。

onCreate() 代码:

@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();
}

可运行代码:

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();
            }
        }

    }
}

我在执行代码时暂停代码时得到的堆栈跟踪:

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)   

【问题讨论】:

  • 什么是线程 [ Binder Thread #1](暂停)?
  • 杰克我不知道为什么它说“线程[活页夹线程#1](暂停)”。我猜我在复制堆栈跟踪时也不小心暂停了该线程。这并不重要,我的问题得到了同样的回答。不过谢谢!

标签: java android multithreading


【解决方案1】:

您只需将genThread.run(); 更改为genThread.start();

现在,您的代码从主线程调用run() 方法。 start() 实际上会启动一个新线程并在那个线程上执行run() 方法,这是期望的行为。

【讨论】:

  • 这很有意义。非常感谢!
  • 难以置信..我忘记使用 start() 而不是 run() (我已经失去了大约 4 个小时)。 ;)
  • 我已经用了 8 年的 java 了,就这样搞定了,真傻! +1
【解决方案2】:

你可以简单地使用这个sn-p。

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

}).start();

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多