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

U.P*_*U.P 29 android

我正在开发一个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();
Run Code Online (Sandbox Code Playgroud)

这个简单的代码给出了运行时错误.即使我取出while循环,它仍然无法正常工作.拜托,任何人都可以告诉我我在做什么错.显然,我直接从电子书中复制了这段代码.它可以起作用但不是.

Kon*_*uda 41

Android命令:您不能与自己的线程中的UI对象进行交互

将您的Toast Display包裹进去 runOnUIThread(new Runnable() { });

  • 我没有把它们算在内,但是每一个都是从敲桌子上来的 (27认同)
  • 你知道多少诫命?:) (10认同)
  • 这应该被接受并标记为正确的答案 (2认同)

Zel*_*mir 34

从Android示例中获取新线程的示例(android-8\SampleSyncAdapter\src\com\example\android\samplesync\client\NetworkUtilities.java):

public static Thread performOnBackgroundThread(final Runnable runnable) {
    final Thread t = new Thread() {
        @Override
        public void run() {
            try {
                runnable.run();
            } finally {

            }
        }
    };
    t.start();
    return t;
}
Run Code Online (Sandbox Code Playgroud)

runnable 是包含网络操作的Runnable.

  • 我不知道为什么这个答案如此受欢迎.在Android中创建线程与在Java中创建线程没有任何不同.OP代码的问题(正如康斯坦丁指出的那样)在于使用背景线程中的Toast - 这个答案没有认识到这一点,也没有显示出如何做到这一点的解决方案. (4认同)
  • 很高兴知道谷歌在使用服务和线程方面有例子.谢谢. (2认同)

ozn*_*nus 12

您可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)