2010-05-01 27 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

相關問題