2013-11-02 28 views
0

嗨,大家好,我試圖設置一個進度條,而在片段轉換時,我的第一個片段onClick調用第二個,它會顯示之前做一些繁重的工作。 這個繁重的工作不使用asynctask,因爲它是緩存中的html的解析。Android進度條,而片段轉換

什麼是最好的方法使這項工作?

我的第一個片段:

private void onClick(final MoodleCourseContent[] courseContent, 
     View layout, final int contentIdx) { 

    layout.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      String courseId = Integer.toString(v.getId()); 
      String courseName = courseContent[contentIdx].getName(); 
      String topicId = (String) v.getTag(); 

      Bundle bundle = new Bundle(); 
      bundle.putString("courseId", courseId); 
      bundle.putString("courseName", courseName); 
      bundle.putString("topicId", topicId); 

      FragmentManager fragmentManager = getActivity() 
        .getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager 
        .beginTransaction(); 

      FragTopics insideTopicsFrag = new FragTopics(); 
      insideTopicsFrag.setArguments(bundle); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction 
        .replace(R.id.mainFragment, insideTopicsFrag); 
      fragmentTransaction.commit(); 
     } 
    }); 
}.... 

我的第二個片段:

public class FragTopics extends Fragment { 

Object course; 
// ManSession Manager Class 
ManSession session; 
String courseId; 
Long topicId; 
String courseName; 

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onViewCreated(view, savedInstanceState); 
} 

public FragTopics() { 
} 

@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
} 

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

    session = new ManSession(getActivity().getApplicationContext()); 

    courseId = getArguments().getString("courseId"); 
    topicId = Long.parseLong(getArguments().getString("topicId")); 
    courseName = getArguments().getString("courseName"); 

    MoodleCourseContent[] courseTopics = new ManContents(getActivity() 
      .getApplicationContext()).getContent(courseId); 

    MoodleCourseContent singleTopic = new ManContents(getActivity() 
      .getApplicationContext()).getTopic(topicId, courseTopics); 

    return createTopics(singleTopic, courseName, courseId, topicId); 
}...... 
+1

如果你有很多繁重的計算,最好的方法可能是在一個異步的話或者在另一個線程中做。否則,在計算完成之前,您將無法渲染片段,然後您將無法顯示進度條。 – Catherine

+0

是的,我假設這是唯一的方法去我避免,因爲我必須改變很多東西,但如果沒有其他方式,我將不得不這樣做 – firetrap

回答

2

最好的辦法是在另一個線程/的AsyncTask的做繁重。即使您的進度條正確顯示,但如果您在UI線程上的響應不夠,即使您的應用程序仍然以「應用程序未響應」終止,您仍有風險。

也就是說,顯示進度條的最簡單方法是使其成爲託管活動的默認佈局的一部分。第一個片段在開始第二個片段之前將其設置爲可見。第二個片段一旦加載,就會找到進度條並將其設置回去。

+0

昨天我試圖實施asynctask與片段,但是工作不好,你能幫忙嗎?一些與asyncTask – firetrap

+0

的例子,你可以看看這個問題是與這個和我有關http://stackoverflow.com/questions/20460170/view-overlap-after-updating-fragment-with-asynctask – firetrap