Есть класс который получает данные для фрагмента
package tanat.androidtesttask.utils;
import android.content.Context;
import java.util.ArrayList;
import tanat.androidtesttask.activity.MainActivity;
public class LoadAllData {
private final Context context;
public LoadAllData(Context context) {
this.context = context;
}
public ArrayList loadDemoData (Context context, int numberOfDownloads){
String jsonStr = "";
if (numberOfDownloads == 0) {
jsonStr = loadLocalData(context);
//делаем проверку на наличие локальной базы
if (jsonStr == null || jsonStr.equals("")) {
jsonStr = loadInetData();
}
} else {
jsonStr = loadInetData();
}
ArrayList demoData = new JSONParsing().examineJSONDemoString(jsonStr);
return demoData;
}
public String loadLocalData (Context context) {
LoadLocalData loadLocalData;
loadLocalData = new LoadLocalData(context);
return loadLocalData.readFile();
}
public void pullLocalData (Context context, String localJsonStr) {
LoadLocalData loadLocalData;
loadLocalData = new LoadLocalData(context);
loadLocalData.writeFile(localJsonStr);
}
public String loadInetData (){
return MainActivity.loadData();
}
}
Но проблема в том что загрузка данных методом loadInetData через MainActivity.loadData() реализована не правильно (я бы даже сказал быдлокод). Этот метод должен получать данные из службы которая создается сразу после старта приложения и в потоке загружает данные из сети, а фрагмент во время загрузки данных должен крутить прогрес диалог. Но я не могу это реализовать уже вторые сутки.
Код фрагмента: package tanat.androidtesttask.fragments;
import android.app.DialogFragment;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import tanat.androidtesttask.activity.InfoRoutActivity;
import tanat.androidtesttask.activity.MainActivity;
import tanat.androidtesttask.R;
import tanat.androidtesttask.service.ConectService;
import tanat.androidtesttask.service.TestService;
import tanat.androidtesttask.utils.LoadAllData;
public class ListFragment extends android.app.ListFragment implements SwipeRefreshLayout.OnRefreshListener{
// unbilder для роботы butterknife с фрагментом
private View rootView;
private DialogFragment dialogFragment;
@BindView(R.id.refresh) SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.standart_layout) LinearLayout contentLayout;
@BindView(R.id.error_layout) LinearLayout errorLayout;
@BindView(R.id.errorTextView) TextView errorTextView;
//кнопка для обновления в случае ошибки
@OnClick(R.id.refreshButton)
void onRefreshClick() {
onRefresh();
}
//подключаем мой фрагмент
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_item, null);
ButterKnife.bind(this, rootView);
dialogFragment = new AlterDialog();
swipeRefreshLayout.setOnRefreshListener(this);
return rootView;
}
private ArrayList data = null;
@Override
public void onStart() {
super.onStart();
onRefresh();
}
//вешаем слушатель на нажатие итема фрагмента
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//передаем позицию елемента в второе активити
//создаем интент
Intent intent = new Intent(ListFragment.this.getContext(), InfoRoutActivity.class);
//записываем в него ключ и позицию
intent.putExtra("position", position);
//передаем
startActivity(intent);
}
int numberOfDownloads = 0;
//свайп вниз для обновления
@Override
public void onRefresh() {
// начинаем показывать прогресс
swipeRefreshLayout.setRefreshing(true);
// вызываем загрузку данных
LoadAllData loadAllData = new LoadAllData(getActivity());
data = loadAllData.loadDemoData(getActivity(), numberOfDownloads);
numberOfDownloads++;
if(data.size() > 0){
// данные для списка есть
// теперь проверим правильно ли была выполнена сетевая операция
if(data.get(0).toString().equals("false")){
// сетевая операция не прошла
// меняем видимость layout так, что б не было видно рабочего layout и был виден
// layout ошибки и вводим текст ошибки в textView
contentLayout.setVisibility(View.INVISIBLE);
errorLayout.setVisibility(View.VISIBLE);
errorTextView.setText(data.get(1).toString());
} else {
//если сетевая операция прошла успешно
errorLayout.setVisibility(View.INVISIBLE);
contentLayout.setVisibility(View.VISIBLE);
// создаем список
createdList();
}
} else {
//если данных списка нету
errorLayout.setVisibility(View.INVISIBLE);
contentLayout.setVisibility(View.VISIBLE);
// создаем список (ListFragment автоматически выведет заданое сообщение)
createdList();
}
// прячем прогресс
swipeRefreshLayout.postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
//либо используем наш класс
// dialogFragment.dismiss();
}
}, 300);
}
private ArrayAdapter<String> adapter;
// метод создание списка
public void createdList(){
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, data);
setListAdapter(adapter);
}
}
Код сервиса:
package tanat.androidtesttask.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutionException;
public class ConectService extends Service {
final String LOG_TAG = "MyLog";
private static Context context;
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "onCreate");
}
private final IBinder binder = new LocalBinder();
private static String inetJsonStr = "";
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_TAG, "onStartCommand");
someTask();
return super.onStartCommand(intent, flags, startId);
}
public void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
public void someTask() {
GetTask getTask = new GetTask();
getTask.execute();
try {
inetJsonStr = getTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public String getInetJsonStr() {
if (inetJsonStr.equals("")){
return null;
} else {
return inetJsonStr;
}
}
public class LocalBinder extends Binder {
public ConectService getService() {
return ConectService.this;
}
}
private class GetTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
String strJson = "";
InputStream inputStream;
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
// получаем данные с внешнего ресурса и переделываем в строку
try {
URL url = new URL("http://projects.gmoby.org/web/index.php/api/trips?from_date=2016-01-01&to_date=2018-03-01");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
inputStream = url.openConnection().getInputStream();
StringBuffer buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
Log.d(LOG_TAG, "strJson not null");
strJson = buffer.toString();
} catch (Exception e) {
e.printStackTrace();
strJson = e.getMessage();
Log.d(LOG_TAG, strJson);
}
return strJson;
}
}
}
Задача явно не из простых и очень надеюсь что здесь найдутся желающие поломать себе голову над этим (я свою уже сломал). Ссылка на git Зарание спасибо.
Стандартный способ решения такой проблемы это т.н. Bound Service
Суть которой с точки зрения прогера состоит в неких манипуляциях при запуске Service с тем, чтобы в оконцове получить ссылку на экземпляр запущенного сервиса, который далее можно использовать как обычный Java объект, обращаясь к нему за некими данными:
ConectService myConnectService;
//бла-бла, связываем и проч.
//***************
myData=myConnectService.getSomeData(); //получаем данные из сервиса
У вас код связывания в самом сервисе уже написан, надо только реализовать вызов биндинга во фрагменте или Activity (читайте в документации - ссылка выше)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники