0

こんにちは私は2つの関数を実行する非同期タスクを作成しようとしています。それらの関数の読み込みが完了すると、UIにデータが入力されます。現時点では、何らかの理由で、関数の1つからのデータと、関数のいずれかが最初にロードを終了したデータでUIを埋めるだけです。

例えば

現時点では、LoadNewsFeed()とLoadResultsFeed()の2つの関数があります。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これらの2つのメソッドを持つクラスを使用して、implement Runnableインターフェイスさせてから、クラスのオブジェクトを作成して Thread コンストラクターに渡すことができます。次に、スレッドで結合を使用します。つまり、スレッドが停止するまで、スレッドが停止しない限り、以下の行を実行しません。結合の直後に、行を使用してデータを UI に配置します。

  2. 特定の作業が完了するのを待ってからさらに実行するパッケージCountDownLatchからもできます。java.util.Concurrent

于 2012-06-11T16:27:19.197 に答える
0

すばやく簡単な方法は、最初は true であるブール フィールドをクラスに追加することです。

private boolean bothFeedsLoaded = true;

次に、onPostExecute で値を切り替えます。

bothFeedsLoaded = !bothFieldsLoaded;

FillData メソッドで:

if (!bothFeedsLoaded){return;}

bothFeedsLoaded は最初は true であるため、onPostExecute への最初のコールバック (フィードが最初に読み込まれた後) によって false に変更されます。したがって、fillData メソッドは何もせずに戻ります。2 番目のフィードの読み込みが完了すると、onPostEexcute がそれを true に戻し、fillData がそれを行います。

別の方法 (そしておそらく 6 か月後には少し読みやすくなります) は、整数を使用することです。

private int feedsLoaded = 0;

.....

feedsLoaded ++;

.....

if (feedsLoaded != 2) {return;}

ロード タスクごとに個別のクラスを作成し、それぞれの onPostExecute コールバックで両方をセマフォと同期するなど、より良い方法がありますが、これは機能するはずです。

于 2012-06-11T15:47:01.883 に答える