Передача ответа от службы классу активности android

У меня есть служба, которая работает для получения значений API и сохранения их в базе данных sql lite. У меня есть отдельный класс для пост-залпа и интерфейс.

class PostVolleyJsonRequest {
private String type;
Service act;
private Service service;
Cryptomain cryptomain;
private VolleyJsonRespondsListener volleyJsonRespondsListener;
private String networkurl;
private JSONObject jsonObject = null;
private JSONObject params;


PostVolleyJsonRequest(Service act, VolleyJsonRespondsListener volleyJsonRespondsListener, String type, String netnetworkUrl, JSONObject params) {
    this.act = act;
    this.volleyJsonRespondsListener = volleyJsonRespondsListener;
    this.type = type;
    this.networkurl = netnetworkUrl;
    this.params = params;
sendRequest();
}

private void sendRequest() {

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, networkurl, params,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    volleyJsonRespondsListener.onSuccessJson(response, type);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    try {
                        NetworkResponse response = error.networkResponse;
                        Log.e("response", "response " + response);
                        if (response != null) {
                            int code = response.statusCode;

                            String errorMsg = new String(response.data);
                            Log.e("response", "response" + errorMsg);
                            try {
                                jsonObject = new JSONObject(errorMsg);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            String msg = jsonObject.optString("message");
                            volleyJsonRespondsListener.onFailureJson(code, msg);
                        } else {
                            String errorMsg = error.getMessage();
                            volleyJsonRespondsListener.onFailureJson(0, errorMsg);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

    AppController.getInstance().addToRequestQueue(jsObjRequest);
}

}

Мой класс обслуживания:

public class Service extends android.app.Service {

private Timer timer = new Timer();


public Service() throws ClassNotFoundException {
}

@Override
public void onCreate() {
    super.onCreate();

    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            sendRequestToServer();   //Your code here
        }
    }, 0, 60*1000);//5 Minutes
}

private void sendRequestToServer() {
    new PostVolleyJsonRequest(Service.this, Service.this,"Zay","https://www.xxxxxx.com/api", null);

}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}



@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}

}

Интерфейс:

public interface VolleyJsonRespondsListener {

public void onSuccessJson(JSONObject result, String type);
public void onFailureJson(int responseCode, String responseMessage);
}

Я могу получить ответ json внутри службы при реализации интерфейса, если мой ввод такой, как показано ниже.

new PostVolleyJsonRequest(Service.this, Service.this,"Zay","https://www.xxxxxx.com/api", null);

Класс, где мне нужен ответ:

public class main extends AppCompatActivity implements VolleyJsonRespondsListener{

private List<dispitems> movieList = new ArrayList<dispitems>();
private RecyclerView recyclerView;
private Adapter mAdapter;
List<Note> notes;


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


    startService(new Intent(this, Service.class));

    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(manager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    mAdapter = new Adapter(movieList);

    recyclerView.setAdapter(mAdapter);


     prepareMovieData();


}

private void prepareMovieData() {
   notes = Select.from(Note.class).fetch();


    if(!notes.isEmpty()) {

        movieList.add(new dispitems(notes.get(0).getBuy(), notes.get(0).getSell()));


    }

    mAdapter.notifyDataSetChanged();
}


@Override
public void onSuccessJson(JSONObject result, String type) {

        //I need the response here
}

@Override
public void onFailureJson(int responseCode, String responseMessage) {

}
}

Теперь я хочу получить ответ в другом классе, кроме Service.this. Я пробовал использовать имя класса во втором параметре, но получаю исключение с нулевым указателем. Как я могу получить ответ в другом классе, реализовав интерфейс?

где вы хотите получить ответ? добавьте этот класс

MJM 11.04.2018 12:29

Я добавил рассматриваемый класс.

user2269164 11.04.2018 12:33

я думаю вам нужно использовать BroadcastReceiverstackoverflow.com/questions/12997463/…

MJM 11.04.2018 12:36

Вы инициализируете запрос в службе и реализуете прослушиватель ответа в Activity. Это неправильно, хорошо, если вы вызываете api в действии, тогда вы можете получать данные в действии. И другое решение - это широковещательный прослушиватель для внедрения в сервис и деятельность. Но зачем вам служба для вызова api ??

Malik Umar 11.04.2018 12:43

Мне нужно обновить адаптер с новыми значениями списка.

user2269164 11.04.2018 12:45
0
5
320
0

Другие вопросы по теме