Страницы

Поиск по вопросам

вторник, 28 мая 2019 г.

(Android) Перезапуск метода при появлении интернета на устройстве

Добрый день! В onCreate методе выполняется запрос данных с удаленного сервера (использую PostResponseAsyncTask). В случае, если на устройстве недоступно или отсутствует подключение к интернету, пользователю выводится соответствующее сообщение. Но хочется, чтобы приложение самостоятельно выполнило действия, описанные в onCreate, при появлении интернет соединения. Как это лучше реализовать?
public class cityActivity extends Activity { private ArrayList cityList; private ListView lvCity; FunDapter adapter;
public void get_cityList() { lvCity = (ListView) findViewById(R.id.list); PostResponseAsyncTask taskRead = new PostResponseAsyncTask(cityActivity.this, new AsyncResponse() { @Override public void processFinish(String s) { if (s == "") { Toast.makeText(cityActivity.this, "Проверьте подключение к интернету!", Toast.LENGTH_LONG).show(); } cityList = new JsonConverter().toArrayList(s, city.class);
BindDictionary dict = new BindDictionary(); dict.addStringField(R.id.tvCity, new StringExtractor() { @Override public String getStringValue(city cityOption, int position) { return cityOption.city_option; } });
adapter = new FunDapter<>(cityActivity.this, cityList, R.layout.layout_city, dict); lvCity.setAdapter(adapter); initTextFilter(adapter);
} }); taskRead.setLoadingMessage("Загружаю список городов"); taskRead.execute("example.com");
AdapterView.OnItemClickListener itemListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View v, int position, long id) { TextView tvCity = (TextView)v.findViewById(R.id.tvCity); String cityOption = tvCity.getText().toString();
Intent intent = new Intent(cityActivity.this, sferaActivity.class);
// в ключ username пихаем текст из первого текстового поля intent.putExtra("cityOption",cityOption); startActivity(intent);
} }; lvCity.setOnItemClickListener(itemListener); } ...
Класс NetworkChangeReciever:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager;
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) { // Do something
} } }


Ответ

Вам нужен BroadcastReceiver который будет слушать состояние сети. и когда она есть можете выполнять нужные вам действия.
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) { // Do something
Log.d("Network Available ", "Flag No 1"); } } }
и интент фильтр

Ну и зарегестрировать его можно либо в activity либо Manifest.xml в теле тега

UPD:
Регистрируем в Активити:
public class cityActivity extends Activity { private ArrayList cityList; private ListView lvCity; FunDapter adapter;
private String BROADCAST_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
IntentFilter intentFilter = new IntentFilter(BROADCAST_ACTION);
BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action) { case BROADCAST_ACTION:
final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) { get_cityList();
Log.d("Network Available ", "Flag No 1"); } break; } } };
@Override protected void onCreate(Bundle savedInstanceState) { //...
registerReceiver(receiver,IntentFilter); }
@Override protected void onResume() { super.onResume(); registerReceiver(receiver,IntentFilter); } @Override protected void onPause() { unregisterReceiver(receiver); }
public void get_cityList() { lvCity = (ListView) findViewById(R.id.list); PostResponseAsyncTask taskRead = new PostResponseAsyncTask(cityActivity.this, new AsyncResponse() { @Override public void processFinish(String s) { if (s == "") { Toast.makeText(cityActivity.this, "Проверьте подключение к интернету!", Toast.LENGTH_LONG).show(); } cityList = new JsonConverter().toArrayList(s, city.class);
BindDictionary dict = new BindDictionary(); dict.addStringField(R.id.tvCity, new StringExtractor() { @Override public String getStringValue(city cityOption, int position) { return cityOption.city_option; } });
adapter = new FunDapter<>(cityActivity.this, cityList, R.layout.layout_city, dict); lvCity.setAdapter(adapter); initTextFilter(adapter);
} }); taskRead.setLoadingMessage("Загружаю список городов"); taskRead.execute("http://remont.qwerq.ru/app/city_list.php");
//...

Комментариев нет:

Отправить комментарий