2012-10-09 6 views
2

조각이 다시 첨부 될 때 My Asynctask가 두 번 실행됩니다. 한 번만 첨부 할 수 있습니다. 이렇게하면 내 asynctask가 실행될 때 탭간에 빠르게 전환 할 때 컨텐츠 뷰가 생성되지 않습니다. 누구든지이 문제에 대한 해결책을 찾았습니까?조각 탭에서 Android Asynctask가 두 번 실행됩니다.

public class AndroidFragment extends SherlockListFragment implements ActionBar.TabListener{ 

static final String URL = "https://xml.xml"; 
static final String KEY_SONG = "song"; 
static final String KEY_ID = "id"; 
static final String KEY_TITLE = "title"; 
static final String KEY_CAT_ARTIST = "artistcat"; 
static final String KEY_DURATION = "duration"; 
static final String KEY_THUMB_URL = "thumb_url"; 
static final String KEY_BIG_URL = "big_url"; 
static final String KEY_CAT_URL = "cat_url"; 
static final String KEY_DESC = "cat_desc"; 
ArrayList<HashMap<String, String>> menuItems; 
ListAdapter adapter; 
Context appContext; 
private Fragment mFragment; 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 


     new loadListView().execute(); 

     if (getActivity() != null) { 
      adapter=new MainPageLazyAdapter(getActivity(), menuItems); 
      setListAdapter(adapter);} 

    super.onViewCreated(view, savedInstanceState); 
     } 

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

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(Integer... args) { 
     // updating UI from Background Thread 
     menuItems = new ArrayList<HashMap<String, String>>(); 


     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // getting XML 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_SONG); 
     // looping through all item nodes <item> 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
      map.put(KEY_CAT_ARTIST, parser.getValue(e, KEY_CAT_ARTIST)); 
      map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
      map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 
      map.put(KEY_BIG_URL, parser.getValue(e, KEY_BIG_URL)); 
      map.put(KEY_CAT_URL, parser.getValue(e, KEY_CAT_URL)); 
      map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 
      // adding HashList to ArrayList 
      menuItems.add(map); 
     } 
      return null; 
     } 


    @Override 
    protected void onPostExecute(String args) { 

    } 
} 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     if (mFragment == null) { 
      mFragment = new AndroidFragment(); 
      ft.add(android.R.id.content, mFragment); 
      //ft.attach(mFragment); 

     } else { 

      if (mFragment.isDetached()){ 
       ft.attach(mFragment); 
      } 


     } 
     } 


    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

     ft.detach(mFragment); 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 


} 

로그 캣 :

10-09 15:21:47.141: E/AndroidRuntime(7582): FATAL EXCEPTION: main 
10-09 15:21:47.141: E/AndroidRuntime(7582): java.lang.RuntimeException: Unable to start activity ComponentInfo{in.wptrafficanalyzer.actionbarsherlocknavtab/in.wptrafficanalyzer.actionbarsherlocknavtab.MainActivity}: java.lang.NullPointerException 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread.access$600(ActivityThread.java:127) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.os.Looper.loop(Looper.java:137) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread.main(ActivityThread.java:4512) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at dalvik.system.NativeStart.main(Native Method) 
10-09 15:21:47.141: E/AndroidRuntime(7582): Caused by: java.lang.NullPointerException 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at in.wptrafficanalyzer.actionbarsherlocknavtab.MainPageLazyAdapter.getCount(MainPageLazyAdapter.java:34) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.widget.ListView.setAdapter(ListView.java:460) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.ListFragment.setListAdapter(ListFragment.java:182) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.ListFragment.ensureList(ListFragment.java:365) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at in.wptrafficanalyzer.actionbarsherlocknavtab.AndroidFragment.onViewCreated(AndroidFragment.java:52) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.Activity.performStart(Activity.java:4475) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1943) 
10-09 15:21:47.141: E/AndroidRuntime(7582):  ... 11 more 
+0

포스트 전체 코드를. 그렇지 않으면, 우리는 당신을 도울 수 없습니다. –

+0

방금 ​​편집했습니다. Trickster –

답변

2

당신이 AsyncTask를 두 번 실행되고 있는지 확인 있습니까? 왜냐하면 AsyncTask가 완료되고 onPostExecute가 호출 될 때 (즉, 프래그먼트가 현재 분리되어 있다고 가정 할 때) 목록이 작성되지 않은 시점에서 setListAdapter를 호출하면 코드와 로그캣에서이 예외가 발생합니다. 따라서 onPostExecute에서 setListAdapter를 호출하는 대신 다운로드 한 항목을 조각에 저장하고 onViewCreated()에서 어댑터로 설정하십시오. 시도 해보고 이것이 당신의 문제를 해결할 수 있다고 말해주십시오.

이 코드를 사용하십시오.

public class AndroidFragment extends SherlockListFragment implements ActionBar.TabListener{ 

    static final String URL   = "https://xml.xml"; 
    static final String KEY_SONG  = "song"; 
    static final String KEY_ID   = "id"; 
    static final String KEY_TITLE  = "title"; 
    static final String KEY_CAT_ARTIST = "artistcat"; 
    static final String KEY_DURATION = "duration"; 
    static final String KEY_THUMB_URL = "thumb_url"; 
    static final String KEY_BIG_URL = "big_url"; 
    static final String KEY_CAT_URL = "cat_url"; 
    static final String KEY_DESC  = "cat_desc"; 
    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>; 
    ListAdapter adapter; 
    Context  appContext; 
    private Fragment mFragment; 

    @Override 
    public void onViewCreated (View view, Bundle savedInstanceState) { 


     new loadListView().execute(); 

     if (getActivity() != null) { 
      adapter = new MainPageLazyAdapter(getActivity(), menuItems); 
      setListAdapter(adapter); 
     } 

     super.onViewCreated(view, savedInstanceState); 
    } 

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

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground (Integer... args) { 
      // updating UI from Background Thread 
      menuItems = new ArrayList<HashMap<String, String>>(); 


      XMLParser parser = new XMLParser(); 
      String xml = parser.getXmlFromUrl(URL); // getting XML 
      Document doc = parser.getDomElement(xml); // getting DOM element 

      NodeList nl = doc.getElementsByTagName(KEY_SONG); 
      // looping through all item nodes <item> 
      for (int i = 0; i < nl.getLength(); i++) { 
       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 
       Element e = (Element) nl.item(i); 
       // adding each child node to HashMap key => value 
       map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
       map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
       map.put(KEY_CAT_ARTIST, parser.getValue(e, KEY_CAT_ARTIST)); 
       map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
       map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 
       map.put(KEY_BIG_URL, parser.getValue(e, KEY_BIG_URL)); 
       map.put(KEY_CAT_URL, parser.getValue(e, KEY_CAT_URL)); 
       map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 
       // adding HashList to ArrayList 
       menuItems.add(map); 
      } 
      return null; 
     } 


     @Override 
     protected void onPostExecute (String args) { 
      if (adapter != null) adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onTabSelected (Tab tab, FragmentTransaction ft) { 

     if (mFragment == null) { 
      mFragment = new AndroidFragment(); 
      ft.add(android.R.id.content, mFragment); 
      //ft.attach(mFragment); 

     } else { 

      if (mFragment.isDetached()) { 
       ft.attach(mFragment); 
      } 


     } 
    } 


    @Override 
    public void onTabUnselected (Tab tab, FragmentTransaction ft) { 

     ft.detach(mFragment); 

    } 

    @Override 
    public void onTabReselected (Tab tab, FragmentTransaction ft) { 

    } 


} 
+0

을 확인하십시오. 죄송합니다 Trickster, 내가 올바르게하고 있는지 잘 모르겠습니다. 나는 실수를 잡았다. 내 코드와 내 logcat을 확인하십시오. –

+0

전에 notifyDataSetChanged를 사용하지 않습니다. 여하튼 나는 당신의 부호를 시도 할 때이 과실을 얻었다. notifyDataSetChanged() 메서드는 ListAdapter 유형에 대해 정의되지 않았습니다. –

+0

어댑터의 부모 클래스는 무엇입니까? –

0

나는이 거기에있을되지 않았 음을 생각을 삭제하려고 : 클래스의

else { 

     if (mFragment.isDetached()){ 
      ft.attach(mFragment); 
     } 
+1

OP를 돕기 위해보다 철저한 설명을 제공해 주시겠습니까? – Fiver

관련 문제