I am trying to do file downloading task using IntentService. I read that IntentService will create a worker thread and does the task requested. The following code will download a video file.
public class MyServiceUsingIntentService extends IntentService{
private int count=0;
public MyServiceUsingIntentService() {
super("MyServiceUsingIntentService");
}
public MyServiceUsingIntentService(String name) {
super("MyServiceUsingIntentService");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try {
URL url = new URL("http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4");
URLConnection urlConnection = url.openConnection();
urlConnection.setReadTimeout(5000);
debugMessage("urlConnection.getContentLength : " + urlConnection.getContentLength());
InputStream readStream = urlConnection.getInputStream();
String filename = "/sdcard/sample" + count++ +".mp4";
OutputStream writeStream = new FileOutputStream(filename);
int i;
byte[] byteArray = new byte[153600];
while((i = readStream.read(byteArray)) != -1){
writeStream.write(byteArray,0,i);
}
writeStream.close();
readStream.close();
debugMessage("Download done in doInBackground");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return START_STICKY;
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
}
public static void debugMessage(String message){
Log.d("MyServiceUsingIntentService",message);
}
}
When i call startService from my MainActivity
startService(new Intent(MainActivity.this, MyServiceUsingIntentService.class));
I am getting NetworkOnMainThreadException error:
12-30 23:51:04.305 9586-9586/oneplus.app7 D/AndroidRuntime: Shutting down VM
12-30 23:51:04.306 9586-9586/oneplus.app7 E/AndroidRuntime: FATAL EXCEPTION: main
Process: oneplus.app7, PID: 9586
java.lang.RuntimeException: Unable to start service oneplus.app7.MyServiceUsingIntentService@be390c with Intent { cmp=oneplus.app7/.MyServiceUsingIntentService }: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3479)
at android.app.ActivityThread.-wrap21(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1657)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6334)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
at java.net.InetAddress.getAllByName(InetAddress.java:752)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:346)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:247)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaders(HttpURLConnectionImpl.java:162)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:206)
at java.net.URLConnection.getHeaderFieldLong(URLConnection.java:628)
at java.net.URLConnection.getContentLengthLong(URLConnection.java:500)
at java.net.URLConnection.getContentLength(URLConnection.java:484)
at oneplus.app7.MyServiceUsingIntentService.onStartCommand(MyServiceUsingIntentService.java:54)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3462)
at android.app.ActivityThread.-wrap21(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1657)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6334)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
But if i try to run downloading part in a thread inside onStartCommand()
its working fine and i was able to download the file.
Do i need to do network operation in separate Thread in case of IntentService
every time?