2015-11-22 3 views
-1

Как мне позвонить AsyncTask в onCreate? Его никогда не называют. Тем не менее, он вызван на , поэтому для имитации я просто запустил еще одно действие и закончил его, но при таком подходе мое приложение не выйдет должным образом.Выполнение `AsyncTask` в android

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new ExternalIP().execute((Void) null); 
     open(); 
    } 

    private void open() { 
     Intent intent = new Intent(this, Sec.class); 
     startActivity(intent); 

    } 

    private class ExternalIP extends AsyncTask<Void, Void, String> { 

     protected String doInBackground(Void... urls) { 
      String ip = "Empty"; 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpGet httpget = new HttpGet("http://wtfismyip.com/text"); 
       //http://ip2country.sourceforge.net/ip2c.php?format=JSON 
       //http://wtfismyip.com/text 
       HttpResponse response; 

       response = httpclient.execute(httpget); 

       HttpEntity entity = response.getEntity(); 
       if (entity != null) { 
        long len = entity.getContentLength(); 
        if (len != -1 && len < 1024) { 
         String str = EntityUtils.toString(entity); 
         ip = str.replace("\n", ""); 

         final TextView tvHelp1 = (TextView) findViewById(R.id.ip); 
         tvHelp1.setText("Public IP: " + ip); 
        } else { 
         ip = "Response too long or error."; 
        } 
       } else { 
        ip = "Null:" + response.getStatusLine().toString(); 
       } 

      } catch (Exception e) { 
       ip = "Error"; 
      } 

      return ip; 
     } 

     protected void onPostExecute(String result) { 

      // External IP 
      Log.d("ExternalIP", result); 
     } 
    } 
} 

Я попытался

new ExternalIP().execute(); 

уже.

+0

движения открытого(); от oncreateView до onPostExecute –

ответ

0

Вместо вызова open(); метода, с которого начинает новую активность, сразу после запуска AsyncTask использовать onPostExecute метод, который выполняется при исполнении doInBackground метод полное:

protected void onPostExecute(String result) { 

      // External IP 
      Log.d("ExternalIP", result); 
      open(); 
     } 
+0

любой фрагмент метода onPostExecute? – MaggotSauceYumYum

+0

@pleaseMOM: см. Мой ответ уже там. –

+0

@pleaseMOM: проблема возникает из-за того, что новая активность запускается сразу после запуска 'AsyncTask', которая заканчивается, потому что текущий метод Activity onStop называется –

0

он никогда не вызывается

Поскольку , Вы начинаете новую операцию перед завершением работы AsyncTask.

Начните вторую активность с onPostExecute вашего класса AsyncTask вместо от onCreate

сделать как это:

protected void onPostExecute(String result) { 
     Log.d("ExternalIP", result); 
     open(); 
} 

И удалить open(); из OnCreate

+0

@pleaseMOM Вы должны найти несколько примеров использования «AsyncTask». Также понимайте, что 'AsyncTask' работает в отдельном параллельном потоке, поэтому он будет продолжать работать, когда ваша активность будет уничтожена, а новая будет запущена. – iceman

1

Старайтесь не делать setText в doInBackground, UI материал должен выполняться в потоке пользовательского интерфейса. Моя ставка - это исключение, которое бросается и спрятано, потому что вы выполняете обработку исключений pokemon.

сдвиг setText в onPostExecute, удалить открытую активность хака и попробуйте еще раз :)

+0

, когда я пытаюсь setText в onPost выполнить, он забывает мою строку («ip») – MaggotSauceYumYum

+0

, если вы забываете, вы имеете в виду, что onPostExecute получает пустую строку, настраивает точки останова и журналы для анализа проблемы.Кроме того, пожалуйста, зайдите в лог пойманных исключений или выполните printStackTrace – Dexter

+0

. Я определил строку «ip», и я получу пустую строку в своем текстовом поле, извините за то, что не был ясен – MaggotSauceYumYum

Смежные вопросы