codemaster001
codemaster001

Reputation: 313

Android AsyncTask json return value

I have called an async task from my button click.In the doInBackground I have called an API and It is returning me a Json object.I want to pass the Json object to another activity on the button click.How can I can get the return Json object value so that I can send it to other activity.

Thanks.

Upvotes: 0

Views: 963

Answers (2)

Ajit Kumar Dubey
Ajit Kumar Dubey

Reputation: 1563

Create Interface

public interface Listener {
void success(BaseModel baseModel);
void fail(String message);
}

Create Base model class

public class BaseModel  implements Serializable {
private static final long serialVersionUID = 1L;
}

Call below method inside your onClick mehtod.

 protected void userLoginData(final String userName) {
// if you want to pass multiple data to server like string or json you can pass in this constructor
     UserLoginLoader  userLoginLoader = new UserLoginLoader(LoginActivity.this, userName, "1234567899", new Listener() {

        @Override
        public void success(BaseModel baseModel) {
             // here you got response in object you can use in your  activity
            UserLoginModel userLoginModel = (UserLoginModel) baseModel;
             // you can get data from user login model

             }catch(Exception exception){
                 exception.printStackTrace();
                 Utils.showAlertDialog(LoginActivity.this, "Server is not responding! Try Later.");
             }
        }

        @Override
        public void fail(String message) {

        }
    });
     userLoginLoader.execute();

}

:- User Login Loader class

public class UserLoginLoader extends AsyncTask<String, Void, Boolean> {
private Dialog dialog;
private Listener listner;
private String deviceId;
Activity activity;
String message;
String userName;
boolean checkLoginStatus;
public UserLoginLoader(Activity activity,String userName, String deviceId, Listener listener) {
    this.listner = listener;
    this.userName =userName;
    this.activity = activity;
    this.deviceId = deviceId;
}


@Override
protected Boolean doInBackground(String... arg0) {
       //User login web service is only for making connection to your API  return data into message string
          message = new UserLoginWebService().getUserId(userName, deviceId);
    if (message != "null"  &&  !message.equals("false")) {
        return true;
    }
    return false;

}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    dialog = new Dialog(activity, R.style.CustomDialogTheme);
    dialog.setContentView(R.layout.progress);
    dialog.setCancelable(false);
    dialog.show();
}

@Override
protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
    BaseModel baseModel = null;
    if (!message.equals("null") && (!message.equals("false")) )
        baseModel = parseData(message, result);

    if (dialog.isShowing()) {
        dialog.dismiss();
        dialog.cancel();
        dialog = null;
    }
    if (listner != null) {
        if (result && baseModel != null)
            listner.success(baseModel);
        else
            listner.fail("Server  not responding! Try agian.");
    } else
        listner.fail("Server  not responding! Try agian.");
}
 //call parser for parsing data return data from the parser
private BaseModel parseData(String responseData, Boolean success) {
    if (success == true && responseData != null
            && responseData.length() != 0) {
        UserLoginParser loginParser = new UserLoginParser(responseData);
        loginParser.parse();
            return loginParser.getResult();

    }
    return null;
}

}

This is you Login parser class

 public class UserLoginParser {
JSONObject jsonObject;
UserLoginModel userLoginModel;

 /*stored data  into json object*/
public UserLoginParser(String data) {
    try {
        jsonObject = new JSONObject(data);
    } catch (JSONException e) {
        Log.d("TAG MSG", e.getMessage());
        e.printStackTrace();

    }
}

public void parse() {
    userLoginModel = new UserLoginModel();
    try {
        if (jsonObject != null) {
             userLoginModel.setUser_name(jsonObject.getString("user_name")== null ? "": jsonObject.getString("user_name"));
             userLoginModel.setUser_id(jsonObject.getString("user_id") == null ? "" : jsonObject.getString("user_id"));
             userLoginModel.setFlag_type(jsonObject.getString("flag_type") == null ? "" : jsonObject.getString("flag_type"));
        } else {
            return;
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    }

}
/*return ship name list which is stored into model */
public UserLoginModel getResult() {
    return userLoginModel;
}

 }

Upvotes: 1

Aniket Thakur
Aniket Thakur

Reputation: 68935

Write a callback method in the Activity that takes in the argument that you wish to pass from AsyncTask to that Activity. Send reference to the Activity to AysncTask while creating it. From doInBackground() method make a call to this callback method with the data your API returns.

Code would be something like -

public class TestAsyncTask extends AsyncTask<Integer, Integer, String[]> {  
    Activity myActivity;
    public TestAsyncTask(Activity activity) {
        this.myActivity = activity;
    }

    @Override
    protected String[] doInBackground(Integer... params) {
        String data = yourApi();
        myActivity.callback(data);
    }
}

public class MyActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        new TestAsyncTask(this).execute(someId);
    }

    public void callback(String data) {
        //process data
    }
}

Just for the record you can directly get return value from doInBackground() method by calling get() on it.

String data = new TestAsyncTask(this).execute(someId).get();

But note this may block your UI thread as it will wait for the doInBackground() method to complete it's execution.

Upvotes: 0

Related Questions