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");
//...