Я хотел бы отобразить «Подключение ...» с помощью Toast до устройство подключено к новой сети (более конкретно, когда IP-адрес получен, см. Цикл while в doInBackground ниже). Я использую AsyncTask для подключения к сети, но если я ставлю Toast.makeText (...). Show() внутри onProgressUpdate(), вызовы toast будут стекаться и в конечном итоге отображать текст дольше, чем нужно. Мой Connect класс:Показать тост от AsyncTask до возникновения события
public class Connect extends AsyncTask<Object,Void,Void>{
private static final String TAG="sure2015test";
private Context context;
private Network network;
@Override
protected Void doInBackground(Object... params) {
this.network=(Network)params[0];
this.context=(Context) params[1];
final WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + network.ssid + "\"";
if(network.password!=null){
conf.preSharedKey = "\""+ network.password +"\"";
}
else{
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
if(network.manager.addNetwork(conf)==-1){
Log.i(TAG, "Add network fail");
}
List<WifiConfiguration> configs = network.manager.getConfiguredNetworks();
for (WifiConfiguration i : configs) {
if (i.SSID != null && i.SSID.equals("\"" + network.ssid + "\"")) {
network.manager.disconnect();
if(network.manager.enableNetwork(i.networkId, true)==false){
Log.i(TAG,"Enable Network fail ");
}
if(network.manager.reconnect()==false) {
Log.i(TAG, "Reconnect fail");
}
}
}
WifiInfo info=network.manager.getConnectionInfo();
while((info.getIpAddress())==0){
//Wait until non-zero IP address (once a non-zero ip address is obtained, you are connected to the network)
//Tried to use NetworkInfo.DetailedState to check if it was CONNECTED
//However the api method said it remained in OBTAINING_IPADDR state even after it obtained an ip (must be bug)
info=network.manager.getConnectionInfo();
publishProgress();
Log.i(TAG,"IP "+info.getIpAddress());
try{
Thread.sleep(100);
}
catch(InterruptedException e){
Log.i(TAG,"Interrupted exception");
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
Toast.makeText(context, "Connecting ...", Toast.LENGTH_SHORT).show();
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
Toast.makeText(context,"Connected",Toast.LENGTH_SHORT).show();
Intent newActivity = new Intent(context, Device.class);
newActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newActivity.putExtra("Device", network.ssid);
context.startActivity(newActivity);
super.onPostExecute(aVoid);
}
}
Я боюсь, что это невозможно сделать с помощью Toast. Вместо этого более распространенная практика заключается в том, чтобы показать Spinner, например, который вы можете показать и спрятать там, где хотите. – harism
@ Харизм это должно быть. Сделайте окончательный частный тост и используйте этот текст. В onProgressUpdate вы хотите вызвать .show(), а затем в onPostExecute вызвать .cancel(). Я сейчас на телефоне, поэтому я не пробовал, но выстрелил. Хотя, да, прядильщик может быть лучше –