0

嗨,我正在尝试创建一个运行两个函数的 Asynctask,当它们完成加载时,然后用数据填充 UI。目前出于某种原因,它仅使用来自某个函数的数据填充 UI,并且哪个函数首先完成加载。

例如

我有两个函数 LoadNewsFeed() 和 LoadResultsFeed() 目前 loadResultsFeed() 显示数据而不是 loadNews() 中的任何内容但是如果我注释掉 LoadResultsFeed() 来自 loadNews 的数据填充 UI 而不是来自 loadResultsFeed

有没有一种方法可以将其设置为如果完成加载,加载另一个而不是执行 FillData() 函数?

这是我到目前为止所拥有的

公共类 PostTask 扩展 AsyncTask {

    @Override
    protected Boolean doInBackground(Void... params) {
        boolean result = false;

        loadNewsFeed();

        publishProgress("method1");
        loadResultsFeed();
        publishProgress("method2");
        return result;
    }


    protected void onProgressUpdate(String... progress) {
        StringBuilder str = new StringBuilder();
            for (int i = 1; i < progress.length; i++) {
                str.append(progress[i] + " ");

            }
    }

        @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        Log.v("BGThread", "begin fillin data");
         FillData();
    }
}

这是我的 FillData() 函数

public void FillData(){ 


     if (ChosenMethod.equals("Team")) {




        arrayAdapter = new ArrayAdapter<String>(this, R.layout.single_item, newsList);

         String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]);
         String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]);

         arrayAdapter3 = new LazyAdapter(this, mStrings, news);


            ListView list = getListView();
               list.setTextFilterEnabled(true);

               LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
                View header = inflater.inflate( R.layout.homeheader, list, false);
                View header2 = inflater.inflate( R.layout.homeheader2, list, false);
                View header3 = inflater.inflate( R.layout.homeheader3, list, false);


        //setListAdapter (arrayAdapter);

                 resultsView = LayoutInflater.from(getBaseContext()).inflate(R.layout.resultscell,
                         null);

               TextView homeTeam = (TextView) resultsView.findViewById(R.id.HomeTeam);
               homeTeam.setText(HomeTeam);

               TextView awayTeam = (TextView) resultsView.findViewById(R.id.AwayTeam);
               awayTeam.setText(AwayTeam);

               TextView homeScore = (TextView) resultsView.findViewById(R.id.HomeScore);
               homeScore.setText(HomeScore);

               TextView awayScore = (TextView) resultsView.findViewById(R.id.AwayScore);
               awayScore.setText(AwayScore);

               TextView attendance = (TextView) resultsView.findViewById(R.id.Attendence);
               attendance.setText("Att:" + Attendance);

               TextView division = (TextView) resultsView.findViewById(R.id.Division);
               division.setText(Division);

               Log.v("BGThread", "Filled results");

            adapter = new MergeAdapter();
            adapter.addView(header);
            adapter.addAdapter(arrayAdapter);
            adapter.addView(header2);
            adapter.addView(resultsView);
            adapter.addView(header3);
            adapter.addAdapter(arrayAdapter3);
            setListAdapter(adapter);

            Log.v("BGThread", "Filled Merge Adapter Team");

     } else {

         arrayAdapter = new ArrayAdapter<String>(this, R.layout.single_item, newsList);
            arrayAdapter2 = new ArrayAdapter<String>(this, R.layout.single_item, newsList2);
            //arrayAdapter3 = new ArrayAdapter(this, R.layout.complex_item, newsList3);

             String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]);
             String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]);


             arrayAdapter3 = new LazyAdapter(this, mStrings, news);


                ListView list = getListView();
                   list.setTextFilterEnabled(true);

                   LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
                    View header3 = inflater.inflate( R.layout.homeheader3, list, false);


            //setListAdapter (arrayAdapter);


                adapter = new MergeAdapter();
                adapter.addView(header3);
                adapter.addAdapter(arrayAdapter3);
                setListAdapter(adapter);

                Log.v("BGThread", "Filled Merge Adapter League");
         } 
}
4

2 回答 2

0

如果使用 AsyncTask 并不重要,我建议使用 Thread 类和 Handler,

  1. 您可以使用join具有这两个方法的类,让它implement Runnable接口,然后您可以创建该类的对象并将其传递给 Thread 构造函数。然后在线程上使用join,这意味着直到并且除非线程死亡它不会执行下面的行,并且在join之后,使用这些行将数据放在UI上。

  2. 你也可以CountDownLatchjava.util.Concurrent包中,等待具体工作完成,然后进一步执行。

于 2012-06-11T16:27:19.197 回答
0

一种快速简便的方法是向您的类添加一个布尔字段,这最初是正确的:

private boolean bothFeedsLoaded = true;

然后在 onPostExecute 中切换它的值:

bothFeedsLoaded = !bothFieldsLoaded;

在您的 FillData 方法中:

if (!bothFeedsLoaded){return;}

由于 bothFeedsLoaded 最初为 true,因此对 onPostExecute 的第一个回调(在先加载哪个 feed 之后)会将其更改为 false。因此,您的 fillData 方法将不做任何事情而返回。当第二个提要完成加载时, onPostEexcute 会将其更改回 true 并且您的 fillData 将执行此操作。

或者(也许在 6 个月内更容易阅读)是使用整数:

private int feedsLoaded = 0;

.....

feedsLoaded ++;

.....

if (feedsLoaded != 2) {return;}

有更好的方法,例如为每个加载任务创建单独的类,然后在它们各自的 onPostExecute 回调中将它们与信号量同步,但这应该可行。

于 2012-06-11T15:47:01.883 回答