0

下部の改訂版を参照これはファイト カードであるため、赤と青の 2 人が互いに戦っています。parse.com からの情報が入力された動的リストである必要があります。最初のクエリはfightOrder. これは、行に 2 つの がある Parse.com のクラスobjectIdです。この情報を私のデータベース (parse.com でも) で検索し、それに応じて情報を表示しますredCornerblueCorner私の問題は、progressDialogボックスが表示され、消えないことです。私のリストにデータが入力されることはありません。ダイアログボックスなしで試してみましたが、リストにクエリを入力しても同じ結果が得られました。

注:リストは正常に機能しています。これは、以前に別の方法で情報をロードするときに使用したリストです。すべてのファイターのデータベースを取得し、そのリストからファイト カードをロードする必要があるため、情報をロードする方法を変更しています。

注: GetCallBackFindCallBackは非同期であるため、これは奇妙なループです。を待つ必要がありdone()ます。

ジャバはこちら

public class databaseFightCard extends Activity {
int I;
int size;
private HomeListAdapter HomeListAdapter;
private ArrayList<HomeItem> HomeItemList;
private SeparatedListAdapter adapter;

//this int is to test for main and coMain events. If one is TRUE, It will assign the array position to main or coMain.
int main, coMain;
ParseQuery<ParseObject> blueCorner = ParseQuery.getQuery("FightersDB");
ParseQuery<ParseObject> redCorner = ParseQuery.getQuery("FightersDB");

String name1, name2;
List<String> red = new ArrayList<String>();
List<String> blue = new ArrayList<String>();
private ListView listView;

ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_list);

   progressDialog = ProgressDialog.show(this, "", "Loading bout...", true);

    initialization();

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            HomeItem homeItem = (HomeItem) adapter.getItem(position);

            AlertDialog.Builder showFighter = new AlertDialog.Builder(databaseFightCard.this, android.R.style.Theme_DeviceDefault_Dialog);

            showFighter.setTitle(homeItem.getHomeItemLeft().toString() + " and " + homeItem.getHomeItemRight().toString());
            showFighter.setMessage("166 - 165\nLogan Utah - Richmond Utah");
            showFighter.setPositiveButton("DONE", null);
            showFighter.setNegativeButton("Cancel", null);
            AlertDialog dialog = showFighter.show();
            TextView messageView = (TextView) dialog.findViewById(android.R.id.message);
            messageView.setGravity(Gravity.CENTER);


            Toast.makeText(getBaseContext(), homeItem.getHomeItemLeft().toString() + " " + homeItem.getHomeItemRight().toString(), Toast.LENGTH_LONG).show();
            System.out.println("Selected Item : " + homeItem.getHomeItemID());
        }
    });


    HomeListAdapter = new  HomeListAdapter(getApplicationContext(), 0, HomeItemList);


    //find the fight card, and read the ids
    ParseQuery<ParseObject> fightOrder = ParseQuery.getQuery("FightCard");
    fightOrder.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> parseObjects, ParseException e) {
            if (e == null) {
                size = parseObjects.size();
                int i = 0;


                while (i < size) {
                    if (parseObjects.get(i).getBoolean("main")) {
                        main = i;
                    }

                    if (parseObjects.get(i).getBoolean("coMain")) {
                        coMain = i;
                    }
                    red.add(i, parseObjects.get(i).getString("redCorner"));
                    blue.add(i, parseObjects.get(i).getString("blueCorner"));
                    i++;
                }

                displayRed();


            } else {
                e.printStackTrace();
            }
        }
    });

}



private void displayRed() {


    adapter = new SeparatedListAdapter(this);

    //find one fighter at a time. in the done() method, start the second fighter.

        redCorner.getInBackground(red.get(I), new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject parseObject, ParseException e) {
                if (e == null) {
                    HomeItemList = new ArrayList<HomeItem>();
                    HomeItem homeItem = new HomeItem();
                    homeItem.setHomeItemID(I);
                    name1 = parseObject.getString("Name");
                    homeItem.setHomeItemLeft(name1);
                    HomeItemList.add(homeItem);
                    if (HomeListAdapter != null) {
                        if (I == main) {
                            adapter.addSection(" MAIN EVENT ", HomeListAdapter);
                        } else if (I == coMain) {
                            adapter.addSection(" Co-MAIN EVENT ", HomeListAdapter);
                        } else {
                            adapter.addSection(" FIGHT CARD ", HomeListAdapter);
                        }
                    }
                  displayBlue();
                } else {
                    e.printStackTrace();
                }
                I++;
                while (I < size){
                    displayRed();
                }
                if (size == I) {
                    listView.setAdapter(adapter);

                    progressDialog.dismiss();
                }

            }
        });
    }




private void displayBlue() {



    //find the red fighters then call the dismiss();

    blueCorner.getInBackground(blue.get(I), new GetCallback<ParseObject>() {
        @Override
        public void done(ParseObject parseObject, ParseException e) {
            if (e == null) {
                HomeItemList = new ArrayList<HomeItem>();
                HomeItem homeItem = new HomeItem();
                homeItem.setHomeItemID(I);
                name2 = parseObject.getString("Name");
                homeItem.setHomeItemLeft(name2);
                HomeItemList.add(homeItem);
                if (HomeListAdapter != null) {
                    if (I == main) {
                        adapter.addSection(" MAIN EVENT ", HomeListAdapter);
                    } else if (I == coMain) {
                        adapter.addSection(" Co-MAIN EVENT", HomeListAdapter);
                    } else {
                        adapter.addSection(" FIGHT CARD ", HomeListAdapter);
                    }
                }

            } else {
                e.printStackTrace();
            }
            //if it is done running through all the IDS, set the listView, and dismiss the dialog.


            I++;
            while (I < size){
                displayRed();
            }
            if (size == I) {
                listView.setAdapter(adapter);

               progressDialog.dismiss();
            }
        }
    });
}


private void initialization() {
    listView = (ListView) findViewById(R.id.Listview);
}

LogCat

java.lang.RuntimeException: このクエリには未解決のネットワーク接続があります。完了するまで待つ必要があります。

それはこの行を指しています:

   while (I < size){
                    displayRed();
                }

編集

これを引き起こしているのは非同期タスクだと思います。

以前のビルドでは、一度に 1 つの項目を呼び出し、それをリストに追加し、完了するまで繰り返し、リストを表示していました。

このビルドで:redCornerリストに追加するように呼び出し、blueCorner add it to the same line を呼び出し、終了するまで繰り返し、リストを表示します。これは次のようになります (以前のビルド)。

ファイトカード


改訂私の質問はまだ答えられていません。多分私はそれを単純化する必要があります。objectId's1つのクラスから+-20になります。関係のないすべてのコードを取り出しました。このコードではまだ予期しない結果が得られます。

       redCorner.getInBackground(red.get(i), new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject parseObject, ParseException e) {
                if (e == null) {

                    Log.d("NAME " + i, name1 + " ");

                    i++;
                    while (i < size) {
                        redCorner.cancel();
                        displayRed();
                    }
                    if (i == size) {
                        progressDialog.dismiss();
                    }

                } else {
                    e.printStackTrace();
                }
            }
        });
4

1 に答える 1

2

これは、非同期コーディングの性質を理解していないもう 1 つのケースです (同じ問題に関する多くの質問を見てきました)。

あなたの場合、displayRed()いくつかの非同期コードを起動してから返すメソッドを呼び出しています。

コードの実行方法は次のとおりです。

  • displayRed()(dr1) への最初の呼び出し
    • (dr1) 非同期redCorner.getInBackground(..)(async1) 開始
    • (dr1) リターン
  • ..しばらく時間が経ちます..
  • (async1)getInBackground(..)コールはデータとともに戻り、コード ブロックを実行します
    • 呼び出しdisplayBlue()(db1)
      • (db1) blueCorner.getInBackground(..)(async2) 開始
      • (db1) を返します
    • whileループを 開始します
      • 呼び出しdisplayRed()(dr2)
        • (dr2) 非同期redCorner.getInBackground(..)(async3) 開始
        • (dr2) まだ何も触れIておらず、別の非同期を開始しようとしredCorner.getInBackgroud(..)ます (async4)
        • エラー

代わりに非同期ブロックが同期を実行しているかのようにコードを記述しています。getInBackgroundこれは、「このデータを取得するために Web 呼び出しを行い、何かが発生した場合 (エラーまたは成功)、私が提供しているこのコード ブロックを別のスレッドで実行する」ことを意味することに注意してください。

物事を達成したい順序について考え、時間がかかるプロセスを開始するように要求していることを認識し、それに応じてコードを調整します。

于 2013-10-01T23:53:27.907 に答える