2017-10-10 76 views
-2

我需要每5分钟后,登录到设备存储“一些文本”可有人点我做到这一点的最好办法。 但我不想让主线程冻结和记录线程应该是活着的时间。 我试过,但它似乎冻结我的模拟器 有没有更好的方式做同样的运行后台服务的Android不冻结UI

public class DataWriteService extends Service { 

private FileIOHelper fileHelper= new FileIOHelper("Test.txt"); 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //Gets location and writes to a file 
    fileHelper.writeToFile(this, "Some text"); 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

}

+2

引用[用于'Service'所述的JavaDoc](https://developer.android.com/reference/android/app/Service.html): “A服务不是线程”,并在[该对于'onStartCommand()'](https://developer.android.com/reference/android/app/Service.html#onStartCommand(android.content.Intent,%20int,%20int))的JavaDoc:“需要注意的是该系统调用此对您的服务的主线程...你应该总是避免拖延主线程的事件循环。当进行长时间运行的操作,网络电话,或者大量的磁盘I/O,你应该启动新线程”。你还没有开始线程,所以你的工作正在冻结你的UI。 – CommonsWare

回答

0

使用Handler或单独的后台线程来完成您长时间工作。一旦完成,将该值发布到UI线程上。

顺便说一句,在Android O +,该服务将只只要你的应用程序是活的运行。一旦你的应用程序进入后台,该应用程序将关闭该服务。考虑使用的jobscheduler