2016-08-29 5 views
0

Я хочу читать данные, составляющие веб-сайт в Async-Task.
Но, хотя я звоню execute(), он не входит в задачу Async.
Не вызывается даже метод preExecute(), по крайней мере запись журнала, которая бы так говорила, не появляется.Почему моя AsyncTask не выполняется?

public class NewFragment extends Fragment { 

    private String mResult; //This Result will be returned by FetchDataTask() 



    private final String LOG_TAG = NewFragment.class.getSimpleName(); 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

    } 

    // fetch data from example.com and show them in textView 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FetchDataTask fetchDataTask = new FetchDataTask(); 

     fetchDataTask.execute("http://example.com"); 


     View rootView = inflater.inflate(R.layout.fragment_new,container,false); 
     TextView textView = (TextView) rootView.findViewById(R.id.textView); 
     textView.setText(mResult); 


     return rootView; 


    } 

    public class FetchDataTask extends AsyncTask<String, Integer, String >{ 

     private final String LOG_TAG = FetchDataTask.class.getSimpleName(); 

     @Override 
     protected void onPreExecute(){ 
      Log.e(LOG_TAG,"onPreExecute()"); //This Log-entry doesn't appear, why?? 
     } 



     @Override 
     protected String doInBackground(String... strings){ 
      //http-connection: 
      HttpURLConnection httpURLConnection = null; 
      BufferedReader bufferedReader = null; 

      String result = ""; 

      try{ 
       URL url = new URL(strings[0]); 
       httpURLConnection = (HttpURLConnection) url.openConnection(); 
       InputStream inputStream = httpURLConnection.getInputStream(); 

       //read data: 

       if(inputStream==null){ 
        Log.v(LOG_TAG,"There is nothin'"); 
       } else { 
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
        String line; 

        while ((line = bufferedReader.readLine()) != null) { 
         result += line + "\n"; 
        } 
       } 




      }catch(Exception e){ 
       Log.e(LOG_TAG, "Error in http connection"+e.toString()); 
      } finally { 
       if(httpURLConnection!=null){ 
        httpURLConnection.disconnect(); 
       } 
       if(bufferedReader != null){ 
        try{ 
         bufferedReader.close(); 
        }catch (final IOException e){ 
         Log.e(LOG_TAG,"Error closing stream", e); 
        } 
       } 
      } 



      Log.e(LOG_TAG,"doInBackground()"); 
      return result; 


     } 
     @Override 
     protected void onPostExecute(String string){ 
      mResult=null; 

      if(string!=null){ 
       mResult=string; 

      } 

     } 
    } 
} 
+0

Можете ли вы показать код активности, содержащий ваш фрагмент или вы проверили Вызывается onCreateView()? –

+0

@KevinLEGOFF onCreateView() работает ... – taxus1

+0

, не связанный с неисполнением вашей асинтетики, но 'textView.setText (mResult);' не будет работать. Вы не делаете этого, когда асинтеза завершена, вы делаете это немедленно, когда задача еще не запущена. – njzk2

ответ

0

Что касается, почему вы не видите сообщение , вы делаете класс Fragment и добавляете к Activity? В противном случае эта проблема не может быть воспроизведена.

// This Result will be returned by FetchDataTask()

Ложные. Это не так, как работает асинхронный код. Вы устанавливаете TextView на null и не дожидаетесь завершения AsyncTask.

Вместо этого просто хранить TextView в поле

private TextView textView; 

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    View rootView = inflater.inflate(R.layout.fragment_new,container,false); 
    textView = (TextView) rootView.findViewById(R.id.textView); 

    FetchDataTask fetchDataTask = new FetchDataTask(); 
    fetchDataTask.execute("http://example.com"); 

    return rootView; 
} 

И позже установите текст

@Override 
protected void onPostExecute(String string){ 

    if(string!=null){ 
     textView.setText(string); 
    } 

} 
+0

Спасибо, действительно хорошее объяснение. Помогли! – taxus1

+0

Добро пожаловать. Я бы посоветовал узнать о других библиотеках HTTP, таких как Volley (или Retrofit, если у вас есть данные JSON), поскольку они лучше работать, чем AsyncTasks. –

-1

Изменения, public class FetchDataTask extends AsyncTask<String, Integer, String> в public class FetchDataTask extends AsyncTask<String, Void, String> сделать подпись похожа на вашу реализацию AsyncTask.

Также добавьте setRetainInstance(true) фрагментами onCreate(), чтобы сохранить вид, в то время как изменения ориентации происходят. Просто лучшая практика.

И, наконец, пусть у вас есть newFragment экземпляр в деятельности, таким образом, называют newFragment.startFetching(), где у вас есть что-то вроде,

public class NewFragment extends Fragment { 
    public void startFetching() { 
     FetchDataTask fetchDataTask = new FetchDataTask(); 
     fetchDataTask.execute("http://example.com"); 
    } 
    ... 
} 

ссылка: https://gist.github.com/daichan4649/2480065

+0

Не могли бы вы объяснить, в чем разница? – RafaelC

+1

Спасибо, хорошая идея! Но, к сожалению, это все еще не работает. – taxus1

+0

он должен реализовать onProgressUpdate() с параметром Integer, чтобы согласовать подпись. –

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