AsyncTaskLoader basic example. (Android)

前端 未结 6 1670
[愿得一人]
[愿得一人] 2020-12-01 02:56

I am using a Loader in my application and based on the result I get from the query I perform on COntacts using this Loader I perform some calculations and store them back in

6条回答
  •  伪装坚强ぢ
    2020-12-01 03:36

    Here's step by step tutorial to implement AsyncTaskLoader. or check out this same article on Medium

    1. Implement LoaderManager.LoaderCallbacks on MainActivity and create a static int to uniquely identify your loader and create a String key to pass string url to your loader

      public class MainActivity extends AppCompatActivity 
                   implements LoaderManager.LoaderCallbacks{
          public static final int OPERATION_SEARCH_LOADER = 22;
          public static final String OPERATION_QUERY_URL_EXTRA = "query";
      //...}
      
    2. Override onCreateLoader,onLoadFinishedand onLoaderReset functions inside MainActivity

      @Override
      public Loader onCreateLoader(int id, final Bundle args) {
          //Here we will initiate AsyncTaskLoader
          return null;
      }
      
      @Override
      public void onLoadFinished(Loader loader, String operationResult) {
          //Think of this as AsyncTask onPostExecute method, the result from onCreateLoader will be available in operationResult variable and here you can update UI with the data fetched.
          Log.d("MAINACTIVITY","result : "+ operationResult);
      }
      
      @Override
      public void onLoaderReset(Loader loader) {
          //Don't bother about it, Android Studio will override it for you
      }
      
    3. inside onCreateLoader() return a new AsyncTaskLoader as an anonymous inner class with this as the constructor's parameter and override loadInBackground & onStartLoading inside anonymous inner class

      @Override
      public Loader onCreateLoader(int id, final Bundle args) {
          return new AsyncTaskLoader(this) {
              @Override
              public String loadInBackground() {
                  //Think of this as AsyncTask doInBackground() method, here you will actually initiate Network call
                  return null;
              }
      
              @Override
              protected void onStartLoading() {
                 //Think of this as AsyncTask onPreExecute() method,start your progress bar,and at the end call forceLoad(); 
                 forceLoad();
              }
          };
      }
      
    4. Inside loadInBackground make a network call using HTTPUrlConnection or OKHttp or anything that you use.

       @Override
          public String loadInBackground() {
              String url = args.getString(OPERATION_QUERY_URL_EXTRA);//This is a url in string form 
              if (url!=null&&"".equals(url)) {
                  return null;//if url is null, return
              }
              String operationResult="";
              try {
                  operationResult = NetworkUtils.getResponseFromHttpUrl(url);//This just create a HTTPUrlConnection and return result in strings
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return operationResult;
          }
      
    5. Inside onCreate initialize the loader with OPERATION_SEARCH_LOADER as the ID, null for the bundle, and this for the context

      getSupportLoaderManager().initLoader(OPERATION_SEARCH_LOADER, null, this);
      
    6. Now call this method, whenever and wherever you want to trigger the loader

      private void makeOperationSearchQuery(String url) {
      
          // Create a bundle called queryBundle
          Bundle queryBundle = new Bundle();
          // Use putString with OPERATION_QUERY_URL_EXTRA as the key and the String value of the URL as the value
          queryBundle.putString(OPERATION_QUERY_URL_EXTRA,url);
          // Call getSupportLoaderManager and store it in a LoaderManager variable
          LoaderManager loaderManager = getSupportLoaderManager();
          // Get our Loader by calling getLoader and passing the ID we specified
          Loader loader = loaderManager.getLoader(OPERATION_SEARCH_LOADER);
          // If the Loader was null, initialize it. Else, restart it.
          if(loader==null){
              loaderManager.initLoader(OPERATION_SEARCH_LOADER, queryBundle, this);
          }else{
              loaderManager.restartLoader(OPERATION_SEARCH_LOADER, queryBundle, this);
          }
      }
      

    Walla, you are done, just to remind you NetworkUtils.getResponseFromHttpUrl(url); is my custom function which take string convert it into URL which in turn used to create HTTPUrlConnection

提交回复
热议问题