Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在服务中启动新线程?_Android - Fatal编程技术网

Android 如何在服务中启动新线程?

Android 如何在服务中启动新线程?,android,Android,我正在开发一个Android应用程序,我正在一项服务中做一些繁重的工作(从在线网页中获取数据,并对其进行解析以存储在数据库中)。目前,大约需要20多分钟,而这一次我的UI被卡住了。我想在服务中使用一个线程,这样我的UI就不会卡住,但它会给出错误。我正在使用以下代码: Thread thread = new Thread() { @Override public void run() { try { while(true) {

我正在开发一个Android应用程序,我正在一项服务中做一些繁重的工作(从在线网页中获取数据,并对其进行解析以存储在数据库中)。目前,大约需要20多分钟,而这一次我的UI被卡住了。我想在服务中使用一个线程,这样我的UI就不会卡住,但它会给出错误。我正在使用以下代码:

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;
        }
    }