2013-02-04 5 views
0

Я проверяю соединение и правильную ссылку перед асинхронизацией, но иногда сбой приложения, поскольку я делаю это в потоке пользовательского интерфейса. Если я поставил код в AsyncTask, приложение всегда терпит крах. Любое решение?Проверить соединение на AsyncTask

На OnCreate метод:

if(connectionOK()) 
     { 
      try { 
       url = new URL(bundle.getString("direccion")); 
       con = (HttpURLConnection) url.openConnection(); 
       if(con.getResponseCode() == HttpURLConnection.HTTP_OK) 
       { 
        Tarea tarea = new Tarea(this); 
        tarea.execute(); 
       } 
       else 
       { 
        con.disconnect(); 
        //show alertdialog with the problem 
        direccionInvalida(); 
       } 
     } catch (Exception e){e.printStackTrace();} 

     } 
     else 
     { 
      //show alertdialog with the problem 
      notConnection() 
     } 
+0

Можете ли вы разместить свой AsyncTask? где вы проверяете соединение? –

+0

Вы могли бы показать свой logcat/stacktrace ошибки? –

ответ

0

Ваш вопрос очень расплывчато!

Тем не менее: В новых андроидов, вы не можете выполнить эту строку в потоке пользовательского интерфейса:

con = (HttpURLConnection) url.openConnection(); 

так простое решение было бы добавить все в новую тему:

new Thread() { 
    public void run() { 
     //add all your code 
    } 
}.start(); 

Однако , ваш код имеет некоторые блоки, чтобы отобразить диалог (угадывание) следующим образом:

//show alertdialog with the problem 
notConnection(); 

Данные функции должно выполняться в потоке пользовательского интерфейса. Так что используйте обработчик:

//add this outsire the thread 
Handler mHandler = new Handler(); 

Затем внутри вашего использования кода:

mHandler.post(new Runnable() { 
    public void run() { 
     notConnection(); 
    } 
}); 

Наконец, это исправление. Реальное решение будет заключаться в том, что вы все равно опубликуете AsyncTask и обработаете ошибки или успехи в onPostExecute()

1

Попробуйте это, проверьте сетевое соединение внутри doInBackground.

public class GetTask extends AsyncTask<Void, Void, Integer> { 

    protected void onPreExecute() { 
     mProgressDialog = ProgressDialog.show(MainActivity.this, 
       "Loading", "Please wait"); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
        if(connectionOK()){ 
     //ADD YOUR API CALL 
       return 0; 
        }esle{ 
        return 1; 
        } 

    } 

    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     if (mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
     } 
        if(result == 0){ 
         //do your stuff 
        }else{ 
         //show alertdialog with the problem 
        } 

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