4

我想不通。

不管出于什么原因,这个线程的代码实际上是在 UI 线程上运行的。如果我断点它 UI 停止。或睡眠它,用户界面停止。因此网络活动是不允许的,因为它在“ui”线程上。

我没有使用过异步任务,因为我不知道循环它的正确方法。(在其中调用它的新实例onPostExecute似乎是一种不好的做法,并且好像 async 是针对一次性任务的。

我扩展线程。

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

1 回答 1

27

您应该使用Thread.start()来启动任何新线程。据我所知,run()直接调用不会导致系统实际启动一个新线程,因此您的 UI 会阻塞。

将您的startThread()方法更改为以下内容,然后它应该可以工作:

public class SyncManager extends Thread {

    public void startThread() {

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

阅读此处以获取来自 Java revisited 博客的更多具体信息。

于 2013-09-03T14:09:37.037 回答