我无法弄明白。
出于任何原因,这个线程的代码实际上是在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();
答案 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重访博客中的更多具体信息。