为什么我的Thread会冻结UI-Thread?

时间:2013-09-03 14:07:04

标签: android multithreading networking freeze ui-thread

我无法弄明白。

出于任何原因,这个线程的代码实际上是在UI线程上运行的。 如果我突破它,UI就会停止。或者睡觉吧,UI停了。因此在“ui”线程中不允许网络活动。

我没有使用过异步任务,因为我不知道循环它的正确方法。 (在onPostExecute中调用它的新实例似乎是不好的做法,就好像异步是针对一个关闭的任务。

我扩展了线程。

public class SyncManager  extends Thread {

public SyncManager(Context context){
    sdb = new SyncManagerDBHelper(context);
    mContext = context;     
}

@Override
public void run() {     

    while(State == RUNNING) {
        try{
            SyncRecords();   // Break point here = UI freeze.
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            Thread.sleep(10000); // So also causes UI freeze.
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 public void startThread() {
    Log.i("SyncManager", "start called");

    if((State == PAUSED || State == STOPPED) && !this.isAlive() )
    {
        State = RUNNING;
        run();      
    }   
}   

来自我的活动我致电

  sm = new SyncManager(this);
  sm.startThread();

1 个答案:

答案 0 :(得分:25)

您应该使用Thread.start()来启动任何新线程。 据我所知,直接调用run() 不会导致系统实际启动新线程,因此阻止了用户界面。

将您的startThread()方法更改为以下内容,然后该方法可以正常运行:

public class SyncManager extends Thread {

    public void startThread() {

        if((State == PAUSED || State == STOPPED) && !this.isAlive()) {
            State = RUNNING;
            start();  // use start() instead of run()
        }   
    }
}

Read here以获取Java重访博客中的更多具体信息。