(Android) Restart method when internet appears on device

Question:

Good day! The onCreate method requests data from a remote server (using PostResponseAsyncTask). In the event that the device is not available or there is no Internet connection, a corresponding message is displayed to the user. But I want the application to independently perform the actions described in onCreate when an Internet connection appears. What is the best way to implement this?

public class cityActivity extends Activity {
private ArrayList<city> cityList;
private ListView lvCity;
FunDapter<city> 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<city>().toArrayList(s, city.class);

            BindDictionary<city> dict = new BindDictionary<city>();
            dict.addStringField(R.id.tvCity, new StringExtractor<city>() {
                @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

        }
    }
}

Answer:

You need a BroadcastReceiver that will listen for the network state. and when it is there you can perform the actions you need.

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");
        }
    }
}

and intent filter

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

Well, you can register it either in activity or Manifest.xml in the body of the <application>

<receiver android:name="NetworkChangeReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

UPD:

Register in Activities:

public class cityActivity extends Activity {
private ArrayList<city> cityList;
private ListView lvCity;
FunDapter<city> 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<city>().toArrayList(s, city.class);

            BindDictionary<city> dict = new BindDictionary<city>();
            dict.addStringField(R.id.tvCity, new StringExtractor<city>() {
                @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");

//...
Scroll to Top