2013-12-08 41 views
0

我假裝的是顯示一個不確定的進度條(目前只是一個用於測試目的的對話框),而我的第二個片段正在獲取數據並構建視圖而不凍結UI。使用Asynctask更新片段後的視圖重疊

我已經試過:

  • 的AsyncTask
  • 裝載機
  • 裝載機AsyncTaskLoader
  • 適配器(沒試過,但也許它的一個選項,但我不知道如何 使用適配器與自定義佈局)

隨着asynctask方法幾乎一切正常,但onPostE xecute我必須更新片段來做到這一點,我創建了一個接口,在主要活動中,我刪除了視圖並添加了新的視圖,但是由於我創建了另一個問題,我的後臺堆棧已經混亂,所以我沒有選項。

的圖,以幫助瞭解它是如何工作的: enter image description here

我的片段2:

public class FragTopics extends Fragment { 

Object course; 
ManSession session; 
String courseId; 
Long topicId; 
String courseName; 
private LinearLayout mainLayout; 
private ScrollView contentScrollable; 
private LinearLayout contentsLayout; 
private View myView; 

public FragTopics() { 
} 

@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"); 

    new HeavyWork().execute(); 

    // Create empty view because i need to return something 
    myView = new View(getActivity()); 
    return myView; 
} 

private class HeavyWork extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog dialog; 
    final FragmentUpdater activity = (FragmentUpdater) getActivity(); 

    // Do the long-running work in here 
    @Override 
    protected Void doInBackground(Void... params) { 

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

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

     // This createTopics call another methods from the fragment class to 
     // get the data and create views 
     myView = createTopics(singleTopic, courseName, courseId, topicId); 
     return null; 

    } 

    protected void onPreExecute() { 
     dialog = new ProgressDialog(getActivity()); 
     dialog.show(); 
    } 

    // This is called when doInBackground() is finished 
    @Override 
    protected void onPostExecute(Void ignore) { 
     activity.updater(myView); 
     dialog.dismiss(); 
    } 

} 

我的界面:

public interface FragmentUpdater { 

    public void updater(View param); 

} 

我的主要活動,其中的接口被實現:

@Override 
    public void updater(View param) { 
     ViewGroup vg = (ViewGroup) findViewById (R.id.main_content); 
     vg.removeAllViews(); 
     vg.addView(param); 
    } 

我的佈局創建程序,這是結構:

->LinearLayout 
    ->TextView 
    ->ScrollView 
    ->LinearLayout 

我的主要問題是如何,而片段2不凍結UI,如果我的上述做法是正確的,如何初始化顯示進度條該heavyWork換句話說就是做了更新後的片段視圖的AsyncTask完成做後臺工作

刪除畢竟視圖後,並添加新的onBackpressed會覆蓋我的看法與以前的片段意見

+2

你最主要的問題是什麼?我不明白你在問什麼? – sockeqwe

+0

我更新了這個問題,我的主要問題是如何在不凍結UI的情況下初始化片段2的同時顯示進度條,並且如果我的上述方法是正確的,那麼如何在重做之後更新片段中的視圖asyncTask完成後臺工作。但在給予負面點之前閱讀所有內容 – firetrap

回答

1

你的片段是無頭的。所以不要實現onCreateView方法。將該代碼移動到onCreate。然後在異步任務中,使用onPostExecute通過更新的信息發信號通知父活動以顯示。此片段的父活動可以決定UI如何對此信息作出反應。請確保您避免與onPostExecute(或onPublishProgress,如果您正在更新)方法以外的任何地方的父級活動進行通信,因爲a)由於多種原因(包括設備輪換和b)這些方法,活動可能爲空) gauranteed在UI線程上運行

+0

好的是有道理的,但我如何設置該片段的內容視圖?換句話說,我該如何將Asynctask中創建的視圖設置爲片段?我需要返回一個視圖,即主要問題的起源 – firetrap

+0

任務代碼只有在工作完成時纔會到達'onPostExecute'。所以用戶界面不會陷入困境,它只是沒有被更新。 如果你在一個單獨的線程上運行'doInBackground',那麼與主UI線程的通信必須通過'Runnable'進行排隊。Activity.runOnUiThread(new Runnable(。 ..));' 您可能想要了解如何將長時間運行的任務與Android中的用戶界面相集成: [保留配置更改中的對象](http://www.androiddesignpatterns.com/2013/) 04 /固定對象,跨配置,changes.html) – Nikolai