2015-05-31 1 views
1

Я хотел бы отобразить «Подключение ...» с помощью 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); 
    } 
} 
+0

Я боюсь, что это невозможно сделать с помощью Toast. Вместо этого более распространенная практика заключается в том, чтобы показать Spinner, например, который вы можете показать и спрятать там, где хотите. – harism

+0

@ Харизм это должно быть. Сделайте окончательный частный тост и используйте этот текст. В onProgressUpdate вы хотите вызвать .show(), а затем в onPostExecute вызвать .cancel(). Я сейчас на телефоне, поэтому я не пробовал, но выстрелил. Хотя, да, прядильщик может быть лучше –

ответ

2

Я предложил бы использовать ProgressDialog вместо Toast. Вы можете показать его перед запуском AsyncTask и скрыть его onPostExecute. Было бы выглядеть like.-

ProgressDialog dialog = ProgressDialog.show(CurrentActivity.this, "", "Connecting...", true, false); 

[...] 

dialog.dismiss(); 

Кстати, не забудьте положить ваши строковые литералы в файле с Strings ресурсов :)

0

Тост не хорошая практика, чтобы показать прогресс работы. Тост предназначен для отображения небольшой и быстрой информации (например, в вашем случае, чтобы показать, что устройство подключено), но, на мой взгляд, лучше реализовать ProgressBar в вашем макете и установить его видимым, пока AsyncTask выполнить doInBackground и установить его невидимым в onPostExecute ,

0

Если вам нужно показать Тост в другом потоке, а также в doInBackground (Object ... PARAMS), вы можете использовать:

YourActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     //put here your thread 
    } 
}); 

Hovewer, вам необходимо получить контекст в этом случае. Я делаю это со статической переменной. Но не забывайте, что Toast появляется только на короткое время, и вы не можете справиться с этим. Если вам нужно постоянно показывать сообщение, вы можете использовать ProgressDialog