0

我正在尝试创建一个片段,该片段在开始时将显示一个 ProgressBar,其他线程将调用一个函数,该函数将带来一些信息(从远程服务器带来的信息 - 需要几秒钟)来填充一些将添加到片段中的视图. 我试图将视图添加到片段中,但出现了一个异常,即我无法更改不在主线程上的线程上的 UI。所以我在 UI 线程上运行它,但这里的问题是 UI 堆叠,直到所有信息从服务器带回的那一刻。

这是我的代码:

public class MainSalePage extends SherlockFragment 
{
    protected View maneSalePage;
    protected List<SaleObj> saleList;
    protected int numberOfsalesOnScreen;
    protected LinearLayout saleConteiner;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        maneSalePage = inflater.inflate(R.layout.main_page_fragment, container, false);
        numberOfsalesOnScreen = 0;
        saleConteiner = (LinearLayout) maneSalePage.findViewById(R.id.salesContainer);


        getActivity().runOnUiThread(new Runnable()
        {
            @Override
            public void run() 
            {
                SaleService saleService = new SaleService();
                saleList = saleService.getNextSales(numberOfsalesOnScreen); //the operation that takes time.
                for(int i = 0; i < saleList.size(); i++)
                {
                    SaleRow saleRow = new SaleRow(getActivity());
                    saleRow.populateWith(saleList.get(i));

                    saleConteiner.addView(saleRow);
                }
            }
        });

        return maneSalePage;
    }

}

如何在从服务器获取所有数据之前显示片段而不堆叠 UI?

谢谢!

4

2 回答 2

3

例如,最好启动一个 AsyncTask 以在后台线程中从服务器下载所有数据。AsyncTask 有有用的处理程序 OnPreExecute 和 OnPostExecute,保证在 UI 线程中运行。因此,您可以在 PreExecute 上放置一个“加载”占位符文本,并在下载数据时,在 onPostExecute 中使用它填充您的 Fragment。

在极少数情况下,如果您希望数据在下载时逐渐显示,请将 onProgressUpdate 处理程序与 publishProgress 方法结合使用。

于 2013-05-21T10:43:56.830 回答
0

尝试这样的事情它会起作用,不是最干净的解决方案,但我喜欢更正代码而不是从草图中编写新代码,这样你就可以看到你在哪里犯了错误

编辑:在与弗拉德聊天时,一个帮助他的解决方案指南

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        maneSalePage = inflater.inflate(R.layout.main_page_fragment, container, false);
        maneSalePage.postDelayed(new Runnable() {

            @Override
            public void run() {
                addContainer();
            }
        }               
        }, 1000);
        return maneSalePage;
    }

        private void addContainer(){
            numberOfsalesOnScreen = 0;
            saleConteiner = (LinearLayout)       maneSalePage.findViewById(R.id.salesContainer);

           SaleService saleService = new SaleService();
        saleList = saleService.getNextSales(numberOfsalesOnScreen); //the operation that takes time.
        for(int i = 0; i < saleList.size(); i++)
        {
            getActivity().runOnUiThread(new Runnable()
            {
                @Override
                public void run() 
                {                       
                        SaleRow saleRow = new SaleRow(getActivity());
                        saleRow.populateWith(saleList.get(i));  
                        saleConteiner.addView(saleRow);

                }
            });
        }
    }

你是一次发送所有的,这样你一个一个地发送

编辑:不要忘记这将一次创建所有 N = saleList.size() 线程。

希望这对您有所帮助并享受您的工作

于 2013-05-21T10:41:31.510 回答