Как вернуть результат из get (ohttp3) - PullRequest
0 голосов
/ 11 марта 2020

Я получаю результат, используя метод get okhttp3. А теперь я хочу вернуть результат в MainActivity.

Я пытался использовать намерение, но мне не удалось. Также я прочитал okhttp3, как вернуть значение из асин c вызова GET . Но я запутался в том, где мне нужно написать этот код.

public interface GetLastIdCallback {
    void lastId(String id);
}

my MainActivity:

getMaskInfo info = new getMaskInfo(this);
info.requestGet(latitude, longitude);

getMaskInfo Activity (я хочу вернуть JSONObject или JSONArray):

package com.example.buymaskapp;

public class getMaskInfo {
    OkHttpClient client = new OkHttpClient();
    public static Context mContext;

    public getMaskInfo(Context context){
        mContext = context;
    }

    public void requestGet(double lat, double lng){
        String url = "https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/storesByGeo/json";

        HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
        urlBuilder.addEncodedQueryParameter("lat", Double.toString(lat));
        urlBuilder.addEncodedQueryParameter("lng", Double.toString(lng));
        urlBuilder.addEncodedQueryParameter("m", "1000");

        String requestUrl = urlBuilder.build().toString();

        Request request = new Request.Builder().url(requestUrl).build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("error", "Connect Server Error is " + e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try{
                    JSONObject jsonObject = new JSONObject(response.body().string());
                    JSONArray totalStore = jsonObject.getJSONArray("stores");
                    System.out.println(jsonObject);                          
                }catch (JSONException e){
                    //
                }
            }
        });
    }
}

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Вместо возврата void из requestGet() метода, верните LiveData

public LiveData<JSONObject> requestGet(double lat, double lng) {
   LiveData<JSONObject> result = MutableLiveData<JSONObject>();

   /* reqeust builder & url builder code here */

   client.newCall(request).enqueue(new Callback() {
   /* override other methods here */

   public void onResponse(Call call, Response response) throws IOException {
            try{
                JSONObject jsonObject = new JSONObject(response.body().string());
                ((MutableLiveData) result).postValue(jsonObject);                        
            }catch (JSONException e){
                /* catch and do something */
            }
        }
   });

   return result;
}

Наблюдайте жизненные данные в mainacctivity

info.requestGet(latitude, longitude).observe(getViewLifeCycleOwner, new Observer() {
   @Override
   public void onCanged(JSONObject result) {
       /* code to use result */   
   }
});

В противном случае вы также можете реализовать интерфейс на mainacctivity и использовать его экземпляр в getMaskInfo или в методе requestGet для отправки данных обратно.

0 голосов
/ 11 марта 2020

Класс интерфейса

public interface GetLastIdCallback {
    void lastId(String id);
    void getJSONCallback(JSONObject  object);
}

Обновление функции onResponse

 @Override
            public void onResponse(Call call, Response response) throws IOException {
                try{
                    JSONObject jsonObject = new JSONObject(response.body().string());
                    JSONArray totalStore = jsonObject.getJSONArray("stores");
                    System.out.println(jsonObject); 
                    ((GetLastIdCallback )(mContext)).getJSONCallback(jsonObject);   //Return here                     
                }catch (JSONException e){
                    //
                }
            }
        });

Операция вызова должна реализовывать интерфейс GetLastIdCallback

public class Main2Activity extends AppCompatActivity  implements GetLastIdCallback{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }

    @Override
    public void lastId(String id) {

    }

    @Override
    public void getJSONCallback(JSONObject object) {
        //Here you can use response according to your requirements 

    }
}
0 голосов
/ 11 марта 2020

Создайте обратный вызов в MainActivity: public void onResult(JSONArray stores) или все, что вы хотите вернуть из вызова. Поскольку теперь вы знаете, что ваш mContext на самом деле MainActivity, вы можете выполнить приведение и вызвать этот метод ((MainActivity)mContext).onResult(totalStore).

Если вам нужно использовать getMaskInfo и с другими действиями, вы можете положить метод onResult в интерфейс, заставить MainActivity реализовать этот интерфейс и передать интерфейс в качестве аргумента getMaskInfo.

...