Страницы

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

воскресенье, 8 марта 2020 г.

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

#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

        }
    }
}

    


Ответы

Ответ 1



Вам нужен 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"); //...

Ответ 2



Немного подкорректированный ответ @kirill-stoianov Работает как часы! public class cityActivity extends Activity { private ArrayList cityList; private ListView lvCity; FunDapter adapter; final 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: get_cityList(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_city); registerReceiver(receiver,intentFilter); } @Override protected void onResume() { super.onResume(); registerReceiver(receiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(receiver); } ...

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

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