Passing data from AsyncTask of ViewModel to Calling Activity

user9207265

I am adding an item to my database using Room.

I get the details of the item from the user in AddFriendActivity, which calls addItem() of AddFriendViewModel which in turn calls subclass AddAsyncTask.

The item gets inserted and I get the id in the doInBackground() or OnPostExecute() of the AsyncTask. Now I need to pass or get this id in my AddFriendActivity.

My Activity:

public class AddFriendActivity extends AppCompatActivity {

    private AddFriendViewModel addFriendViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .
        .
        .
        addFriendViewModel = ViewModelProviders.of(this).get(AddFriendViewModel.class);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addFriend();
            }
        });

    }

    private void addFriend() {
        .
        .
        .
        addFriendViewModel.addFriend(new FriendEntity(...));
        finish();
    }
}

My ViewModel class with subclass AddAsyncTask:

public class AddFriendViewModel extends AndroidViewModel {

    private AppDatabase appDatabase;

    public AddFriendViewModel(Application application) {
        super(application);
        appDatabase = AppDatabase.getDatabase(this.getApplication());
    }

    void addFriend(final FriendEntity friendEntity) {
        AddAsyncTask myTask = new AddAsyncTask(appDatabase);
        myTask.execute(friendEntity);
    }

    private static class AddAsyncTask extends AsyncTask<FriendEntity, Void, Long> {

        private AppDatabase db;

        AddAsyncTask(AppDatabase appDatabase) {
            db = appDatabase;
        }

        @Override
        protected Long doInBackground(final FriendEntity... params) {
            return db.friendDao().insert(params[0]);
        }

        @Override
        protected void onPostExecute(Long insertedId) {

        }
    }
}
rajan ks

Add an interface

  public interface IdCallback{
     void onFriendInserted(Long id);
    }

Implement it in AddFriendActivity

class AddFriendActivity extends AppCompatActivity implements IdCallback{
private AddFriendViewModel addFriendViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    .
    .
    .
    addFriendViewModel = ViewModelProviders.of(this).get(AddFriendViewModel.class);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            addFriend();
        }
    });

}

private void addFriend() {
    .
    .
    .
    addFriendViewModel.addFriend(new FriendEntity(...),this);//<-- pass this
    finish();
}

 public void onFriendInserted(Long id){
  // do something with id
 } 
...

}

Pass interface to our ViewModel via constructor and call this on getting back Id

 public class AddFriendViewModel extends AndroidViewModel {

    private AppDatabase appDatabase;
    private IdCallback callback;

    public AddFriendViewModel(Application application) {
        super(application);
        appDatabase = AppDatabase.getDatabase(this.getApplication());
    }

    void addFriend(final FriendEntity friendEntity,IdCallback callback) {
        AddAsyncTask myTask = new AddAsyncTask(appDatabase);
        this.callback = callback; //< assign
        myTask.execute(friendEntity);
    }

    private static class AddAsyncTask extends AsyncTask<FriendEntity, Void, Long> {

        private AppDatabase db;

        AddAsyncTask(AppDatabase appDatabase) {
            db = appDatabase;
        }

        @Override
        protected Long doInBackground(final FriendEntity... params) {
            return db.friendDao().insert(params[0]);
        }

        @Override
        protected void onPostExecute(Long insertedId) {
            callback.onFriendInserted(insertedId);
        }
    }
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Android - passing data from AsyncTask to Activity

Passing json data from an activity to another with AsyncTask

Passing data from Activity to Fragment using AsyncTask - Android

Calling method of activity from asynctask

passing control from activity when using asynctask

Passing data to activity from widget

Passing data from second activity to first activity

Getting data from AsyncTask class to the Activity

Send data to Fragment(Not Activity) from AsyncTask

Receiving the json data from asynctask to activity

Passing Data to custom adapter from asyncTask

Passing a json object to asynctask class from activity class

If I call an asyncTask from a thread will the onPostExecute() execute on the thread or the calling activity

MvvmCross passing data from One viewmodel to another viewmodel

Passing `SharedPreferences` data from Fragment to Activity

Passing data from one activity to another and then printing

Xamarin Android passing data from class to activity

Passing data from listView to another Activity EditText

Passing data from list fragment to new activity

Passing Data from Dialog box to activity

passing data from activity to tabs fragment

Passing data from Activity to Fragment shows nothing

Passing Data from Fragment to Activity using listview

Passing a data from Activity to Tabbed Layout Fragment?

Passing data from intent service to activity

Passing data from activity to swipeable view fragment

Passing Intent data from Activity to Class

passing data from fragment to activity is not same

Passing data from activity to fragment in android is not working