Search code examples
javaandroidmultithreadingthreadpoolexecutorservice

How to implement a background thread using java.util.concurrent package?


This is the code I used first but in latest Android version AsyncTask class is deprecated and therefore it was not responding and then I used the Thread class but that class is also not working. I want the same result as I was getting with the AsyncTask class. I know that I have to use some executor class of java.util.concurrent package but don't know which and how to use it. Please help me with this thing.

private static final String USGS_REQUEST_URL =
            "https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-05-02&minfelt=50&minmagnitude=5";

EarthquakeAsyncTask task = new EarthquakeAsyncTask();
        task.execute(USGS_REQUEST_URL);
private class EarthquakeAsyncTask extends AsyncTask<String, Void, Event> {

        @Override
        protected Event doInBackground(String... urls) {

            // Perform the HTTP request for earthquake data and process the response.
            Event result = Utils.fetchEarthquakeData(urls[0]);
            return result;
        }

        @Override
        protected void onPostExecute(Event result) {
            // Update the information displayed to the user.
            updateUi(result);
        }
    }
private static final String USGS_REQUEST_URL =
            "https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-05-02&minfelt=50&minmagnitude=5";

earthquakeRunnable runnable = new earthquakeRunnable(USGS_REQUEST_URL);
        runnable.start();

private class earthquakeRunnable extends Thread{

            String urls;
            earthquakeRunnable(String url){
                this.urls = url;
            }
            @Override
            public void run() {
                // Perform the HTTP request for earthquake data and process the response.
                Event result = Utils.fetchEarthquakeData(urls);
                // Update the information displayed to the user
                updateUi(result);
            }
        }

Solution

  • Here's an example of how you might use an ExecutorService within your Activity/Fragment:

    // Create some member variables for the ExecutorService 
    // and for the Handler that will update the UI from the main thread
    ExecutorService mExecutor = Executors.newSingleThreadExecutor();
    Handler mHandler = new Handler(Looper.getMainLooper());
    
    // Create an interface to respond with the result after processing
    public interface OnProcessedListener {
        public void onProcessed(Event result);
    }
    
    private void processInBg(final String url, final boolean finished){
        
        final OnProcessedListener listener = new OnProcessedListener(){
            @Override
            public void onProcessed(Event result){
                // Use the handler so we're not trying to update the UI from the bg thread
                mHandler.post(new Runnable(){
                    @Override
                    public void run(){
                        // Update the UI here
                        updateUi(result);
                        
                        // ...
                        
                        // If we're done with the ExecutorService, shut it down.
                        // (If you want to re-use the ExecutorService,
                        // make sure to shut it down whenever everything's completed
                        // and you don't need it any more.)
                        if(finished){
                            mExecutor.shutdown();
                        }
                    }
                });
            }
        };
        
        Runnable backgroundRunnable = new Runnable(){
            @Override
            public void run(){
                // Perform your background operation(s) and set the result(s)
                Event result = Utils.fetchEarthquakeData(url);
                
                // ...
                
                // Use the interface to pass along the result
                listener.onProcessed(result);
            }
        };
        
        mExecutor.execute(backgroundRunnable);
    }
    

    Then, wherever you need to trigger your background processing:

    processInBg("some_url", true);
    

    Depending on your situation, you'll want to customize your implementation of ExecutorService to better suit your needs.