Android 如何在服务中启动新线程?
我正在开发一个Android应用程序,我正在一项服务中做一些繁重的工作(从在线网页中获取数据,并对其进行解析以存储在数据库中)。目前,大约需要20多分钟,而这一次我的UI被卡住了。我想在服务中使用一个线程,这样我的UI就不会卡住,但它会给出错误。我正在使用以下代码:Android 如何在服务中启动新线程?,android,Android,我正在开发一个Android应用程序,我正在一项服务中做一些繁重的工作(从在线网页中获取数据,并对其进行解析以存储在数据库中)。目前,大约需要20多分钟,而这一次我的UI被卡住了。我想在服务中使用一个线程,这样我的UI就不会卡住,但它会给出错误。我正在使用以下代码: Thread thread = new Thread() { @Override public void run() { try { while(true) {
Thread thread = new Thread()
{
@Override
public void run() {
try {
while(true) {
sleep(1000);
Toast.makeText(getBaseContext(), "Running Thread...", Toast.LENGTH_LONG).show();
}
} catch (InterruptedException e) {
Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
}
}
};
thread.start();
这段简单的代码给出了运行时错误。即使我取出while循环,它仍然不工作。
请问,谁能告诉我我犯了什么错误。显然,我是直接从电子书上复制了这段代码。它应该能工作,但它不能 从Android示例创建新线程的示例(Android-8\SampleSyncAdapter\src\com\Example\Android\samplesync\client\NetworkUtilities.java):
runnable
是包含网络操作的runnable。Android命令:您不得从自己的线程与UI对象交互
将Toast显示包装到
runOnUIThread(newrunnable(){})中代码>您可以在可运行对象中定义作业,使用线程对象运行作业,并在服务的onStartCommand()
函数中启动此线程。这是我的笔记:
在您的服务类中:
在Runnable
对象中定义主循环
创建Thread
对象,并将runnable对象作为参数
在服务类的onStartCommand
method()中:
调用线程对象的启动函数()
我的代码:
private Runnable busyLoop = new Runnable() {
public void run() {
int count = 1;
while(true) {
count ++;
try {
Thread.sleep(100);
} catch (Exception ex) {
;
}
ConvertService.running.sendNotification("busyLoop" + count);
}
}
};
public int onStartCommand(Intent intent, int flags, int startId) {
sendNotification("onStartCommand");
if (! t.isAlive()) {
t.start();
}
return START_STICKY;
}
您可以使用HandlerThread并将其发送给它,下面是一个示例,它提供了一个服务
public class NetworkService extends Service {
private HandlerThread mHandlerThread;
private Handler mHandler;
private final IBinder mBinder = new MyLocalBinder();
@Override
public void onCreate() {
super.onCreate();
mHandlerThread = new HandlerThread("LocalServiceThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
}
public void postRunnable(Runnable runnable) {
mHandler.post(runnable);
}
public class MyLocalBinder extends Binder {
public NetworkService getService() {
return NetworkService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
什么是“运行时错误”?如果在Android中阻止UI线程的时间超过5秒,则会出现错误。所以,你肯定需要新的线程来在后台完成你的任务。应用程序只是崩溃了。这是创建线程的正确方法吗?也许您应该使用IntentService
它为您处理所有线程。这似乎是一个函数,意味着需要调用它。我应该调用的是:performOnBackgroundThread(new Runnable(){…?在服务的onCreate()中?您不需要将其用作函数。您可以像最初一样使用它。重要的是,您创建了新的Runnable,并将与服务器通信的代码放入其中。因此,您不能只放入new Runnable()作为函数performOnBackgroundThread()的参数,您需要将新的Runnable定义为单独的实体(函数)。原始代码也会启动一个线程。这个答案没有什么不同。但至少我们知道,正式允许它启动一个线程:)很高兴知道谷歌在服务和线程的使用方面有这样的例子。谢谢。我不知道为什么这个答案会被如此高估。在android中创建线程和在Java中创建线程没有什么不同。OP代码的问题(正如Konstantin指出的)用背景线烤面包——这个答案没有意识到这一点,也没有给出解决方法。我没有数它们,但每一个都是头撞桌子的结果
public class NetworkService extends Service {
private HandlerThread mHandlerThread;
private Handler mHandler;
private final IBinder mBinder = new MyLocalBinder();
@Override
public void onCreate() {
super.onCreate();
mHandlerThread = new HandlerThread("LocalServiceThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
}
public void postRunnable(Runnable runnable) {
mHandler.post(runnable);
}
public class MyLocalBinder extends Binder {
public NetworkService getService() {
return NetworkService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}