2010-05-01 54 views
18

一切都在标题中。是否可以在Service类中使用AsyncTask?

在官方文档中指出,Note that services, like other application objects, run in the main thread of their hosting process和AsyncTask只有在UIThread中执行时才有效。

那么有可能在Service类中使用AsyncTask?

我想这样做,但我总是得到同样的错误

05-01 18:09:25.487: ERROR/JavaBinder(270): java.lang.ExceptionInInitializerError 

...

05-01 18:09:25.487: ERROR/JavaBinder(270): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

我是不是做错了什么或者这只是不可能?

这里是我的服务类

package com.eip.core; 

import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 

public class NetworkService extends Service { 


    private final INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      new ConnectTask().execute("test42"); 
      return 0; 
     } 
    }; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    private class ConnectTask extends AsyncTask<String, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Log.i("OnPreExecute()", ""); 
     } 

     @Override 
     protected Void doInBackground(String... arg0) { 
      Log.i("doInBackground()", ""); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Log.i("OnPostExecute()", ""); 
     } 

    } 
} 

回答

2

我想我发现它为什么不是在我的情况下工作。

在这里,我用这个:

private final INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      new ConnectTask().execute("test42"); 
      return 0; 
     } 
    }; 

我用这做什么所谓的IPC,进程间通信,所以我想我的服务,我的活动有两种型动物过程中,的AsyncTask必须根据android文档在主UI线程中执行,所以为什么我试图做的事情根据这些事实在我看来根本不可能。

如果我错了,请有人能纠正我。

12

此外,一定要检查出IntentService的代码。如果这个类足够满足您的需求,它将处理很多涉及使这个模式正常工作的小细节。

1

也许问题不是AsyncTask,而是别的。例如,你确定你的onBind方法工作正常吗?请试试这个:

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

你也可以试试

public class NetworkService extends Service{ 
    @Override 
    public void onStart(Intent intent, int startId) { 
    new ConnectTask().execute("test42"); 
    } 
} 
1

是否可以在Service类中使用AsyncTask?

是的。请参阅Reto Meier(2010)专业Android 2应用程序开发,Wrox。梅耶尔拥有published supporting code(见/第9章地震4/src目录/ COM/paad /震/ EarthquakeService.java):

public class EarthquakeService extends Service {   
    ... 
    private EarthquakeLookupTask lastLookup = null; 
    ... 

    private class EarthquakeLookupTask extends AsyncTask<Void, Quake, Void> { 
     ... 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) {  
     ... 
     refreshEarthquakes(); 
     return Service.START_NOT_STICKY; 
    }; 

    private void refreshEarthquakes() { 
     ... 
     lastLookup = new EarthquakeLookupTask(); 
     lastLookup.execute((Void[])null); 
     ... 
    } 
} 

上的之外,我无法找到任何证据来支持你的要求说:“的AsyncTask只是作品如果它在UIThread中执行“(虽然这将是violate threading rules)。

+0

嗨,它没有违反线程规则,因为你的服务总是在UI线程上运行,直到你不从线程分叉线程 – user1530779 2015-02-05 04:18:34

+0

因此,上面的代码将工作得很好,我想你在服务和意图服务之间感到困惑,意图服务默认在后台线程中运行 – user1530779 2015-02-05 04:26:54

相关问题