Main UI freezes even when tasks are handled by AsyncTask
android, android-asynctask, service
Solution
Even though the work is done in AsyncTask it still freezes my main activity.
You are using `get()`:
doc = new NetTask().execute(links.get(in)).get();
And `get()` blocks the UI thread until the AsyncTask has completed, to me this method defeats the purpose of using a AsyncTask...
You should move this logic:
if (doc != null) {
Elements names = doc.select("strong, li");
if(names != null && names.size() > 0) {
for (int j = 0; j < names.size(); j++) {
editor.putString("header"+j, names.get(j).text().toString());
}
}
editor.commit();
}
Inside your `NetTask`'s `onPostExecute()` method and remove `get()`. Now your AsyncTask won't bind-up the main thread.
Problem
I made `Service` that runs on the background collecting data from internet using `AsyncTask` and storing them in `Shared Preferences`. Even though the work is done in `AsyncTask` it still freezes my main activity. Here is the code for Service: ``` public class GetterService extends Service { SharedPreferences.Editor editor; HashMap<Integer,String> links = new HashMap<Integer,String>(); @Override public void onCreate() { editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); populateLinks(); } private void populateLinks(){ // Here I add links to HashMap } @Override public IBinder onBind(Intent intent) { Toast.makeText(this, "GetterService ON BIND", Toast.LENGTH_LONG).show(); return null; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "GetterService ON DESTROY", Toast.LENGTH_LONG).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { doTasks(); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { Toast.makeText(this, "GetterService ON UNBIND", Toast.LENGTH_LONG).show(); return super.onUnbind(intent); } private void doTasks(){ for (Integer in : links.keySet()) { Document doc = null; try { doc = new NetTask().execute(links.get(in)).get(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (doc != null) { Elements names = doc.select("strong, li"); if(names != null && names.size() > 0) { for (int j = 0; j < names.size(); j++) { editor.putString("header"+j, names.get(j).text().toString()); } } editor.commit(); } } } public class NetTask extends AsyncTask<String, Integer, Document> { @Override protected Document doInBackground(String... params) { Document doc = null; try { doc = Jsoup.connect(params[0]).timeout(5000).get(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return doc; } } } ``` and here is how I start the service from main activity: ``` Intent startServiceIntent = new Intent(this, GetterService.class); this.startService(startServiceIntent); ```