2014-10-15 3 views
0

Я пытаюсь реализовать динамическую загрузку listView, поэтому при запуске я запускаю AsyncTask, а затем OnScrollListener я вызываю другую асинтеску для загрузки большего количества просмотров. Но я получаю исключение.android.os.NetworkOnMainThreadException Exception

Вот мой код:

общественного класса HomeFragment расширяет фрагмент {

private ListView lv; 
private FeedListAdapter adapter; 
private List<Reclamation> data; 
ProgressDialog pDialog; 
View loadMoreView; 

// Flag for current page 
int current_page = 1; 

private String URL = Const.GET_FEEDS_URL + "/?page=1"; 

public HomeFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.home_fragment, container, 
      false); 
    setHasOptionsMenu(true); 

    lv = (ListView) rootView.findViewById(R.id.list_of_feed); 
    data = new ArrayList<Reclamation>(); 

    new getFeedsTask().execute(); 


    loadMoreView = ((LayoutInflater) getActivity().getSystemService(
      Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.loadmore, 
      null, false); 

    lv.addFooterView(loadMoreView); 
    adapter = new FeedListAdapter(getActivity(), data); 

    lv.setOnScrollListener(new OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

      new loadMoreListView().execute(); 



     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 


     } 
    }); 

    return rootView; 

} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.home_fragment, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Fragment fragment = null; 
    // Handle action bar actions click 
    switch (item.getItemId()) { 
    case R.id.create_new_delay: 
     fragment = new ReportDelayFragment(); 
     if (fragment != null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.frame_container, fragment).commit(); 

     } 

    default: 
     return super.onOptionsItemSelected(item); 
    } 

} 

private class getFeedsTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
     pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Veuillez patienter!!"); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.getFeeds(URL); 


     try { 
      if (json != null) { 
       JSONArray feeds = json.getJSONArray("feed"); 
       for (int i = 0; i < feeds.length(); i++) { 
        JSONObject feedObj = (JSONObject) feeds.get(i); 

// Добавляем элементы

    data.add(reclamation); 

       } 
       //adapter.notifyDataSetChanged(); 
      } else { 
       if (BuildConfig.DEBUG) { 
        Log.e("JSON Data", 
          "Didn't receive any data from server!"); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     pDialog.hide(); 
     lv.setAdapter(adapter); 
     super.onPostExecute(result); 
    } 

} 

private class loadMoreListView extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     getActivity().runOnUiThread(new Runnable() { 
      public void run() { 

       // increment current page 
       current_page += 1; 

       // Next page request 
       URL = Const.GET_FEEDS_URL + "/?page=" + current_page; 

       UserFunctions userFunction = new UserFunctions(); 
       JSONObject json = userFunction.getFeeds(URL); 


       try { 
        if (json != null) { 
         JSONArray feeds = json.getJSONArray("feed"); 
         for (int i = 0; i < feeds.length(); i++) { 
          JSONObject feedObj = (JSONObject) feeds.get(i); 
          //adding items 

          data.add(reclamation); 

         } 
        } else { 
         if (BuildConfig.DEBUG) { 
          Log.e("JSON Data", 
            "Didn't receive any data from server!"); 
         } 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       // get listview current position - used to maintain scroll 
       // position 
       int currentPosition = lv.getFirstVisiblePosition(); 

       adapter = new FeedListAdapter(getActivity(), data); 
       lv.setAdapter(adapter); 
       // Setting new scroll position 
       lv.setSelectionFromTop(currentPosition + 1, 0); 
      } 
     }); 
     return null; 
    } 

} 

}

onScrollListner Я gettiong это исключение:

10-15 22: 45: 08.267: E/AndroidRuntime (19252): FATAL EXCEPTION: main 10-15 22: 45: 08.267: E/AndroidRuntime (19252): Процесс: com.moroccotd.mtd, PID: 19252 10-15 22: 45: 08.267: E/AndroidRuntime (19252): android.os.NetworkOnMainThreadException 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at java.net.InetAddress.lookupHostByName (InetAddress.java:385) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at java.net.InetAddress.getAllByNameImpl (InetAddress.java:236) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at java.net.InetAddress.getAllByName (InetAddress.java: 214) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apach e.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:137) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:164) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:119) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java:360) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:670) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at org.apache.http.impl.client.AbstractHttpClient. выполнить (AbstractHttpClient.java:509) 10-15 22: 45: 08.267: E/AndroidRun время (19252): at org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:487) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at com.moroccotd.mtd. backend.JSONParser.getJSONFromUrl (JSONParser.java:47) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at com.moroccotd.mtd.backend.UserFunctions.getFeeds (UserFunctions.java:173) 10 -15 22: 45: 08.267: E/AndroidRuntime (19252): at com.moroccotd.mtd.HomeFragment $ loadMoreListView $ 1.run (HomeFragment.java:248) 10-15 22: 45: 08.267: E/AndroidRuntime (19252)): at android.os.Handler.handleCallback (Handler.java:733) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at android.os.Handler.dispatchMessage (Handler.java:95) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at android.os.Looper.loop (Looper.java:157) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at android.app.ActivityThread.main (ActivityThread.java:5356) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at java.lang.reflect.Method.invokeNative (собственный метод) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): при java.lang.reflect.Method.invoke (Method.java:515) 10-15 22: 45: 08.267: E/AndroidRuntime (19252)): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1265) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at com.android.internal.os.ZygoteInit .main (ZygoteInit.java: 1081) 10-15 22: 45: 08.267: E/AndroidRuntime (19252): at dalvik.system.NativeStart.main (родной метод)

+1

Моя проблема отличается тем, что я уже использую asynctask –

ответ

1

Вы не должны выполнять сетевые операции на ui/Main нить я знаю, что вы используете задачу асинхронной, но именно поэтому вы получите вид ошибки в коде здесь

getActivity().runOnUiThread(new Runnable() {public void run() {}); 

это делает его запустить на потоке пользовательского интерфейса, несмотря на асинхронную красоту задачи .. я хотел бы предложить вам удалить этот код и пусть асинхронная работа задачи и использование postexecute для публикации в поток ui.

+0

Это именно то, что мне нужно, лет я спас свою жизнь, спасибо вам большое :) –

+0

Я рад, что смог помочь, счастлив, и ты тоже спасибо @NajouaMahi – Elltz

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