2015-09-01 45 views
-4

大家都知道,当您使用数据库操作时,应该在另一个Thread中执行此操作。但是,我不明白的是,当你插入一个项目时,或者当用户打开ActivityFragment例如数据刚刚从数据库加载时,用户将等待加载结束任何内容时,它才真正需要。 也许它甚至会在创建新线程时停止应用程序。 那么你认为创建新线程是“必须”呢?Android另一个线程

+0

如果您的主线程在其他地方仍处于忙碌状态,并且不会为新的UI刷新屏幕提供服务,UI将显示为口吃。此外,如果android检测到UI冻结太多(比如超过5秒),系统将显示ANR(app not responding)错误。所以,让主线程免费用于UI服务。 –

回答

1

一个线程应该用在一个长时间运行的进程中,它会阻止用户界面的更新。如果超过一秒或两秒钟,您可能需要将其放入后台线程中,并通过对话框或微调器或其他方式通知用户。如果您锁定UI线程超过5秒钟,系统将提示用户执行杀死或等待选项。

1

要有良好的用户体验,重型作品应该在另一个线程中运行,这样就没有任何滞后或阻塞,用户体验更好。

创建新线程所用的时间比执行查询或http请求或其他繁重工作所花费的时间少很多。也许在这个时间你的手机短,但低级别的手机可能需要更多的时间。 5秒之后,Android向用户显示一个警告,询问用户是否想要杀死该应用或等待,但这并不好。

另一点,用户必须等待数据才能使用它,但如果您在主线程中执行请求,视图将被阻止,如果在另一个线程中执行该视图,则视图很流畅,您可以显示简单的进度酒吧,如果用户想返回应用程序仍然响应。

我可以理解,发送邮件beetwen线程是不容易喜欢做在主线程,但如果你使用公交车,像奥托总线(http://square.github.io/otto/),并以这种方式

扩展总线类公共类AndroidBus扩展总线{

private final Handler mainThread = new Handler(Looper.getMainLooper()); 

@Override 
public void post(final Object event) { 
    if (Looper.myLooper() == Looper.getMainLooper()) { 
     super.post(event); 
    } else { 
     mainThread.post(new Runnable() { 
      @Override 
      public void run() { 
       post(event); 
      } 
     }); 
    } 
} 

}

这样ü可以伊斯利发送消息beetwen线程