2013-07-10 3 views
0

LoadXMLData이라는 AsyncTask 클래스가 있으며, 알다시피 doInBackground() 메서드에서 XML 데이터를 구문 분석합니다.AsyncTask 결과 데이터를 조각에서 가져 오는 중

public class LoadXMLData extends AsyncTask<String, RSSFeed, RSSFeed>{ 

public static final int DIALOG_DOWNLOAD_PROGRESS = 0; 
private ProgressDialog mProgressDialog; 


private Context context; 
RSSFeed feed; 



public LoadXMLData(Context context) { 
    this.context = context; 
    mProgressDialog = new ProgressDialog(context); 
    mProgressDialog.setMessage("Molimo Vas, sačekajte. Podaci se učitavaju."); 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    mProgressDialog.show(); 
    Log.d("OVDE SAM:", "onPreExecute()"); 
} 

@Override 
protected RSSFeed doInBackground(String... urls) { 
    // Obtain feed 
    DOMParser myParser = new DOMParser(); 
    feed = myParser.parseXml(urls[0]); 
    Log.d("OVDE SAM:", "PARSIRAM XML"); 
    return feed; 
} 



@Override 
protected void onPostExecute(RSSFeed result) { 
    mProgressDialog.dismiss(); 

    super.onPostExecute(result); 
} 

}

는 그리고 나는 그 AsyncTask를 데이터를 얻을 필요가 몇 조각을 보유하고 있습니다. 내가 어떻게 할 수 있니?

다음은 NajnovijeFragment이라는 코드의 코드입니다.

public class NajnovijeFragment extends Fragment{ 

GridView lv; 
RSSFeed feed; 
CustomListAdapter adapter; 
private String RSSFEEDURL = "http://balkanandroid.com/feed/"; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_najnovije, container, 
      false);  


    lv = (GridView) view.findViewById(R.id.GridView1); 

    // Set an Adapter to the ListView 
    adapter = new CustomListAdapter(); 
    lv.setAdapter(adapter); 

    // Set on item click listener to the ListView 
    lv.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      // actions to be performed when a list item clicked 
      int pos = arg2; 

      Bundle bundle = new Bundle(); 
      bundle.putSerializable("feed", feed); 
      Intent intent = new Intent(getActivity(), DetailsActivity.class); 
      intent.putExtras(bundle); 
      intent.putExtra("pos", pos); 
      startActivity(intent); 

     } 
    }); 

    return view; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    adapter.imageLoader.clearCache(); 
    adapter.notifyDataSetChanged(); 
} 

class CustomListAdapter extends BaseAdapter { 

    private LayoutInflater layoutInflater; 
    public ImageLoader imageLoader; 

    public CustomListAdapter() { 

     layoutInflater = (LayoutInflater) getActivity().getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader = new ImageLoader(getActivity().getApplicationContext()); 
    } 

    public int getCount() { 
     // TODO Auto-generated method stub 
     // Set the total list item count 
     return feed.getItemCount(); 
    } 

    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     // Inflate the item layout and set the views 
     View listItem = convertView; 
     int pos = position; 
     if (listItem == null) { 
      listItem = layoutInflater.inflate(R.layout.list_item, null); 
     } 

     // Initialize the views in the layout 
     ImageView iv = (ImageView) listItem.findViewById(R.id.thumb); 
     TextView tvTitle = (TextView) listItem.findViewById(R.id.title); 
     TextView tvDate = (TextView) listItem.findViewById(R.id.tvDate); 

     // Set the views in the layout 
     imageLoader.DisplayImage(feed.getItem(pos).getImage(), iv); 
     tvTitle.setText(feed.getItem(pos).getTitle()); 
     tvDate.setText(feed.getItem(pos).getDate()); 

     return listItem; 
    } 

} 

}

답변

4

ASyncTask에서 데이터를 가져 오는 가장 쉬운 방법은 콜백을 구현하는 것입니다.당신의 조각에서

private OnXMLLoadFinishedListener listener; 

public void setOnXMLLoadFinishedListener(OnXMLLoadFinishedListener listener){ 
    this.listener = listener; 
} 

@Override 
protected void onPostExecute(RSSFeed result) { 
    super.onPostExecute(result); 
    listener.onXMLDataReady(RSSFeed results); 
} 

을 : 당신 LoadXMLData에서

public interface OnXMLLoadFinishedListener { 
    public void onXMLDataReady(RSSFeed results); 
} 

:

public class NajnovijeFragment extends Fragment implements OnXMLLoadFinishedListener{ 

및 onXMLDataReady 오버라이드 (override) :

인터페이스를 만들기

@override 
public void onXMLDataReady(RSSFeed results){ 
    //display your data. 
} 

당신이 당신의 AsyncTask를 인스턴스를 만들 때, 그렇지 않으면이 작동하지 않습니다 리스너를 설정 있는지 확인하십시오

LoadXMLData xmlLoader = new LoadXMLData(); 
xmlLoader.setOnXMLLoadFinishedListener(this); 
+0

이 작품, 고마워요! – Zookey

1

AsyncTask를 사용하면이 고려해야 구문 분석이 XML로 UI를 업데이트해야 할 경우 UI와 매우 관련있는 클래스이다

  • 은 AsyncTask를 확인을 조각의 내부 클래스 또는
  • 조각을 asynctask에 전달하십시오.
  • 조각의보기를 onPostExecute()에서 업데이트하십시오.
  • 어떤 경우

당신이 당신의 활동이 null의 경우 그렇다면 ..., 확인 업데이트 뷰, 그런 일하지 않도록해야합니다 :

onPostExecute(Object xml) { 
    if(getActivity != null) { 
     // update Views like... 
     textViewLabel.setText(parsedXml.getTitle); 
    } 
} 

난 당신이 자바 클래스입니다 SafeAsyncTask를 사용하는 제안을

SafeAsyncTask.java

How to use it!

다음 Roboguice 프로젝트, 하나 개의 파일에서 그리고 그것은 java.util.concurrent.Callable 관련이 바로 소스를 복사 및 붙여 넣기
+0

내가 조각 클래스의 내부 클래스로서 AsyncTask를 사용하려고,하지만 난에 AsyncTask를의 결과를 얻을 수 있습니다 STIL 내 feed.getItemCount()에서 nullpointer 예외가 발생하므로 RSS 피드 피드가 발생합니다. RSSFeed 피드에 null이 생기기 때문입니다. – Zookey

+0

문제는 XML 파서와 관련이 있습니다. 맞습니까? "Simple"은 XML 파서입니다. 정말 좋습니다. 확인 : http://simple.sourceforge.net/ –

+0

아니, 모든 XML 파서 괜찮아요, 문제는 그냥 조각 클래스에서 AsyncTask의 결과를 얻을 수 있습니다. – Zookey

1

AsyncTask는 이미 컨텍스트를 알고 있으므로 onPostExecute에서 액티비티 (ActivityMain)를 콜백 할 수 있습니다. 예 :

귀하의 작업에 loadCompleteHandler를 구현하는 방법은 귀하에게 달려 있습니다. 이제 활동이 존재하지 않을 수 있으므로 활동이 제거 될 때 AsyncTask를주의해서 취소해야합니다. 활동에 속한 단편도 활동에 액세스 할 수 있습니다.

+0

나는 이것으로 내 문제를 해결하는 방법을 모른다. – Zookey

+0

loadCompleteHandler를 구현하여 결과를 액티비티의 어딘가에 저장하고 프래그먼트를 거기에서 가져 오도록하십시오. –

+0

일부 코드를 게시 할 수 있습니까? – Zookey

관련 문제