The main user interface freezes even when performing AsyncTask tasks

I made a Service that works in the background of collecting data from the Internet using AsyncTask and storing them in Shared Preferences . Despite the fact that the work was done in AsyncTask , it still freezes my main activity.

Here is the code for the 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 this is how I start the service from the main activity:

 Intent startServiceIntent = new Intent(this, GetterService.class); this.startService(startServiceIntent); 
+4
source share
4 answers

Although the work is done in AsyncTask, it still freezes my main activity.

You use get() :

 doc = new NetTask().execute(links.get(in)).get(); 

And get() blocks the UI thread until AsyncTask is complete, for me this method defeats the goal of using 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 method NetTask onPostExecute() and remove get() . Now your AsyncTask will not bind the main thread.

+8
source

This is because

 new NetTask().execute(links.get(in)).get(); 

call.

AsyncTask.get () blocks until the asynchronous call completes. To be asynchronous you need to implement

 onPostExecute() 

and process the results there.

+4
source

Do not call get() , just call execute() . Inject and override onPostExecute() to take the Document object as a parameter. onPostExecute() is called automatically when doInBackground() returns. The code in onPostExecute() is executed in the user interface thread, so you can interact with the user interface this way.

I suggest you take a look at the AsyncTask section in this document http://developer.android.com/guide/components/processes-and-threads.html and the AsyncTask API page here, http://developer.android.com/reference/android /os/AsyncTask.html .

0
source

I had a similar problem and I understood what was going on. This code will not block the user interface , but if you set 'for loop and sleep inside onProgressUpdate , then the UIs will be frozen during the process.

 public class Karaoke extends AsyncTask<Void, Integer, Void> { private Handler mHandler = new Handler(Looper.getMainLooper()); protected Void doInBackground(Void... urls) { animating = true; { for (int i = 0;i < 6; i++) { publishProgress(i); try { Thread.sleep(1000); publishProgress(i); } catch (Exception xx){ } } } animating = false; return null; } @Override protected void onProgressUpdate(Integer... values) { if (light) { light = false; iv_array[findview(egtxts[values[0]].getText() + "")].setImageResource(onpress); } else { light = true; iv_array[findview(egtxts[values[0]].getText() + "")].setImageResource(onup); } } protected void onPostExecute(Long result) { //showDialog("Downloaded " + result + " bytes"); } } 
0
source

All Articles