0

나는 8 일 동안 동일한 문제가 발생했으며 누군가가 나를 도울 수 있기를 바란다. 여러 RSS 피드를 구문 분석하고 목록 뷰에 조각을 표시하는 응용 프로그램에서 작업하고 있지만 문제는 UI 2 ~ 4 초 동안 차단되고 사용자가 화면을 터치 할 때마다 응용 프로그램이 중단됩니다. 문제를 추적 한 결과 데이터를 비동기 적으로 가져와야한다는 사실을 알게되었습니다. 실제로는 그렇게했으나 조각이있을 때마다 같은 문제가 발생합니다. 실제로 데이터 조각을 주 스레드에서 가져 오는 경우 조각을 차단하면 실제로 데이터를 비동기 적으로 가져 오는 반면 차단 이유는 알 수 없습니다. 내가 코드를 변경하는 방법프래그먼트 및 AsyncTask

이되고, 이것은 내가 좋아하는 내 조각 여기에 그것을 얻을 내 인터페이스

public interface OnTaskFinishedListener { 
void onTaskFinished(ArrayList<Article> articles); 
} 

내가 마지막으로이

public class AndroidSaxFeedParserAsync extends AsyncTask<String, Long,ArrayList<Article>> { 
ArrayList<Article> rssItems = new ArrayList<Article>(); 

public URL feedUrl; 

OnTaskFinishedListener onTaskFinishedListener; 

public AndroidSaxFeedParserAsync(OnTaskFinishedListener _onTaskFinishedListener) 
{ 
    onTaskFinishedListener = _onTaskFinishedListener ; 
    } 

@Override 
protected void onPostExecute(ArrayList<Article> result) { 
    super.onPostExecute(result); 
    onTaskFinishedListener.onTaskFinished(result); 
} 
@Override 
protected ArrayList<Article> doInBackground(String... params) { 
//.... 
    return rssItems; 
} 

} 

와 같은 AsyncTask를에 ArrayList에 무엇입니까이다 이

public class FeedPlayerIndexFragment extends SherlockFragment implements OnTaskFinishedListener{ 

String url="http://www.whatever.com/index.php?format=feed&amp;type=rss"; 
ArrayList<Article> feeds; 
ItemAdapterArticle lfa; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    new AndroidSaxFeedParserAsync(new OnTaskFinishedListener() { 
     @Override 
     public void onTaskFinished(ArrayList<Article> articles) { 
     } 
    }).execute(url); 
    View view=inflater.inflate(R.layout.main, container, false); 
//.... 
return view; 
} 

@Override 
public void onTaskFinished(ArrayList<Article> articles) { 
    lfa = new ItemAdapterArticle(getActivity().getApplicationContext(), articles); 
    } 

}

답변

2

실제로 차단중인 AsyncTask.get() 호출을 사용하고 있습니다. UI 스레드를 차단하지 않는이 문제에 대한 또 다른 해결책이 있습니다. 간단한 인터페이스를 정의해야합니다.

public interface OnTaskFinishedListener { 
    void onTaskFinished(List<Article> articles); 
} 

Fragment은이 인터페이스를 구현해야합니다. AsyncTask을 인스턴스화 할 때 FragmentOnTaskFinishedListener 인스턴스로 생성자의 매개 변수로 보냅니다. AsyncTaskOnTaskFinishedListener 인스턴스에 대한 참조를 보유해야하며 작업이 완료되면 onPostExecute()에 인스턴스에 onTaskFinished()이라고 부릅니다. 이제 Fragment에서이 호출에 응답하고 articles 매개 변수를 사용하여 UI 구성 요소를 채울 수 있습니다. 희망이 도움이됩니다.

+0

코드를 사용해 보았지만 ArrayList

에서 Fragment가 null을 반환하면 코드 –

+0

@ user1664332를 작성할 수 있습니까? 코드를 작성할 수 없으며 프리랜서가 아닙니다. 나는 당신에게 해결책에 대한 아이디어를주었습니다. 이제는 그것을 구현하는 것이 당신의 임무입니다. 아이디어를 완전히 이해하지 못했다면 언제든지 질문하십시오. – Egor

+0

나 자신에 의해 implemnt 할 수 있도록 제발, 내가 따라야 할 단계를 줘, 지금까지 내가 내 인터페이스를 만들고 조각을 구현하고 내가 생성자 AsyncTask (OnTaskFinishedListener)를 만들 때까지 나는 두 개의 onTaskFinished 메서드를 하나의 인터페이스의 구현에 덤프하고 두 번째는 asyncTask의 onPartExecute()에서 onTaskFinished()를 호출하여 프래그먼트와 finallt에서 AsyncTask를 호출하기 때문에 발생하지만 아무것도 결과가 없습니다. . –