Using AsyncTask inside a service class?

I need to upload data to the server. I use a service that runs in the same process as my application. Should I use a separate thread for the download process or should I use AsyncTask to upload data to the server?

In particular, is it possible to use AsyncTask inside a service class? And should I use it? This service must always work in memory to send data to the server every 5 seconds.

+3
source share
3 answers

Yes you can, the code below will run every 5 seconds. Use the normal connection code to send the part.

public class AsyncTaskInServiceService extends Service { public AsyncTaskInServiceService() { super("AsyncTaskInServiceService "); } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } @Override protected void onHandleIntent(Intent intent) { final Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //Connect to database here try { } catch (JSONException e) { e.printStackTrace(); } } }, 0, 5000); } } 
+2
source

No problem using AsyncTask in a service.

NOTE / FIX: I made a mistake when I said that the service is running in the background, but only for the IntentService application. As noted in the comments and in the documentation , the service does not create its own stream:

Attention: the service runs in the main thread of its hosting - the service does not create its own thread and does not start in a separate process (unless you specify otherwise). This means that if your service will perform any intensive work with the CPU or block operations (for example, playing MP3s or a network), you must create a new thread in the service to do this work.

This means that you must use AsyncTask (or another thread anyway) to complete your loading task.

+5
source

Use AsyncTask in a service in android

 package ​com.emergingandroidtech.Services; import ​android.app.Service; import​ android.content.Intent; import​ android.os.IBinder; import ​android.util.Log; import​ android.widget.Toast; import​ java.net.MalformedURLException; import​ java.net.URL; import android.os.AsyncTask; public​ class ​MyService ​extends​ Service​ { ​​​​@Override ​​​​public​ IBinder ​onBind(Intent​ arg0)​ { ​​​​​​​​return ​null; ​​​​} ​​​​ @Override ​ ​​​public​ int ​onStartCommand(Intent ​intent,​int​ flags,​int ​startId)​ { ​​​​​​​​ //​We​ want ​this ​service ​to ​continue ​running ​until​ it ​is ​explicitly ​​​​​​​​//​stopped,​so​ return ​sticky. ​​​​​​​​ Toast.makeText(this,​"Service​Started",​Toast.LENGTH_LONG).show(); ​​​​​​​​try { ​​​​​​​​​​​​new DoBackgroundTask().execute( ​​​​​​​​​​​​​​​new URL("http://www.google.com/somefiles.pdf"), ​​​​​​​​​​​​​​​​​​​​new URL("http://emergingandroidtech.blogspot.in")); ​​​​​​​​ } catch (MalformedURLException e) { ​​​​​​​​​​​​e.printStackTrace(); ​​​​​​​​} ​​​​​​​​return ​START_STICKY; ​ ​​​} ​​​​ @Override ​​​​public ​void ​onDestroy() ​{ ​​​​​​​​super.onDestroy(); ​​​​​​​​Toast.makeText(this,​"Service​Destroyed",​Toast.LENGTH_LONG).show(); ​​​ ​} ​​​​ ​​​​private ​int ​DownloadFile(URL​ url) ​{ ​try​ { ​​​​​​​​​​​​//---simulate​ taking ​some​time ​to ​download ​a​ file--- ​​​​​​​​​​​​ Thread.sleep(5000); ​​​​​​​​} ​catch​(InterruptedException ​e)​ { ​​​​​​​​​​​​e.printStackTrace(); ​ ​​​​​​​} ​​​​​​​​//---return ​an ​arbitrary ​number​ representing ​ ​​​​​​//​the ​size​ of ​the ​file ​downloaded--- ​ ​​​​​​​return​ 100; ​ ​​​} ​​​​ private class DoBackgroundTask extends AsyncTask<URL, Integer, Long> { ​​​​​​​​protected Long doInBackground(URL... urls) { ​​​​​​​​​​​​int count = urls.length; ​​​​​​​​​​​​long totalBytesDownloaded = 0; ​​​​​​​​​​​​for (int i = 0; i < count; i++) { ​​​​​​​​​​​​​​​​totalBytesDownloaded += DownloadFile(urls[i]); ​​​​​​​​​​​​​​​​//---calculate percentage downloaded and ​​​​​​​​​​​​​​​​// report its progress--- ​ ​​​​​​​​​​​​​​​publishProgress((int) (((i+1) / (float) count) * 100)); ​ ​​​​​​​​​​​} ​​​​​​​​​​​​return totalBytesDownloaded; ​​ ​​​​​​} ​​​​​​​​ protected void onProgressUpdate(Integer... progress) { ​​​​​​​​​​​​Log.d("Downloading files", ​​​​​​​​​​​​​​​​​​​​String.valueOf(progress[0]) + "% downloaded"); ​​​​​​​​​​​​ Toast.makeText(getBaseContext(), ​​​​​​​​​​​​​​​​String.valueOf(progress[0]) + "% downloaded", ​​​​​​​​​​​​​​​​Toast.LENGTH_LONG).show(); ​​​​​​​​ } ​​​​​​​​ protected void onPostExecute(Long result) { ​​​​​​​​​​​​Toast.makeText(getBaseContext(), ​​​​​​​​​​​​​​​​​​​​"Downloaded " + result + " bytes", ​​​​​​​​​​​​​​​​​​​​Toast.LENGTH_LONG).show(); ​​ ​​​​​​​​​​stopSelf(); ​​​​​​​​} ​ ​​​} } 

Try it, maybe this is work. Thanks.

-5
source

All Articles