2016-12-12 11 views
1

私はBack4Appを使用しています。これは、元のparse.comの基本的なものです。私はコードのこの部分を持っている私の公開リストは、それが持っているはずのような5つの要素を持っています。それから私の方法から抜け出すと、そのリストは空です。メソッドでは、私のリストには要素がありますが、リストが空になったときに

ParseQuery<settings> query = ParseQuery.getQuery(settings.class); 
query.whereEqualTo("Username", MainActivity.Display_Name); 
query.orderByDescending("createdAt").setLimit(1); 

query.findInBackground(new FindCallback<settings>() { 
public void done(List<settings> settingsList, ParseException exception) { 
    for (settings i : settingsList) { 
     if (exception == null) { 
      creationDate = i.getCreatedAt(); 
      settingsFrameNumber = i.getFramesPerHive(); 
      settingsArray.add(0, String.valueOf(settingsFrameNumber)); 

      settingsHiveNumber = i.getHiveNumber(); 
      settingsArray.add(0, String.valueOf(settingsHiveNumber)); 

      settingsHiveBodyNumber = i.getHiveBodies(); 
      settingsArray.add(0, String.valueOf(settingsHiveBodyNumber)); 

      settingsSuperNumber = i.getSupers(); 
      settingsArray.add(0, String.valueOf(settingsSuperNumber)); 

      settingsYearsOfBeekeeping = i.getYearsofBeekeeping(); 
      settingsArray.add(0, String.valueOf(settingsYearsOfBeekeeping)); 

      settingsLocation = i.getLocation(); 
      settingsArray.add(0, settingsLocation); 

      Log.e("Pay Attention", settingsArray.toString()); 

      } 
     } 
    } 
}); 

Log.e("Pay Attention", settingsArray.toString()); 

return settingsArray; 

最初のログ文を返す:[Littleton, 5, 4, 3, 1, 2]

2番目のログ文を返す:私は、以前のクラスのリストを作成し、それを行う方法にちょうどローカルではない[]

public static List<String> settingsArray = new ArrayList<String>(); 
+0

どちらが最初でどちらがどちらですか? 'findInBackground()'メソッドは非同期なので、2つの間に競合条件が存在する可能性があります。なぜ 'done()'メソッドで 'settingsArray = settingsList.clone()'をしないのですか? – Shark

+1

完了したメソッド内のログの前のログが、おそらく実行されます。これはちょうど非同期コードの動作です - あなたはネットワーク要求を待っていますが、一方のコードが "上にある"にもかかわらずデータが完成する前にデータを持っていると仮定しないでください –

答えて

1

私は私の方法から抜け出すいったんリストは空です。

これは問題です。あなたはそのメソッドから「出ていない」ということです。まだ入力されていません。

基本的に、待機中のデータを返す場合は、非同期メソッドから返さないでください。

あなたは正しく、そのリストを返したい場合は、どちらかnew FindCallback<settings>()

  1. 峠そのメソッドのパラメータとして、そして送信することができ、独自のコールバックインタフェースを定義しfindInBackground

  2. にそれを与えますdoneメソッド内のデータを返します。

どちらの場合でも、方法はvoidにすることができます。

例えば

、オプション1(メソッドを含むクラスの任意のインスタンスの必要性があるように表示されませんので、私はそれが静的製)

public static void doStuff(String displayName, FindCallback<settings> callback) 

    ParseQuery<settings> query = ParseQuery.getQuery(settings.class); 
    query.whereEqualTo("Username", displayName); 
    query.orderByDescending("createdAt").setLimit(1); 

    query.findInBackground(callback); 
} 

そして、それはそれです。

あなたはどこからでもそう呼ばれますが、実際にはApiServiceを実際のクラス名に置き換えてください。

private List<settings> settings; 

private void setupList(List<settings> settings) { 
    Log.d("SETTINGS", String.valueOf(settings)); // Shouldn't be empty 
    this.settings = settings; 

    /* Use the list however you want to... */ 
    // adapter = new ArrayAdapter(MainActivity.this, settings); 
    // listView.setAdapter(adapter); 
} 

@Override 
public void onCreate(Bundle b) { 
    super.onCreate(b); 
    setContentView(R.layout.some_example); 

    ApiService.doStuff(MainActivity.Display_Name, new FindCallback<settings>() { 
     public void done(List<settings> settingsList, ParseException exception) { 
      if (exception == null) { 
       ... 
       // Update the UI here 
       setupList(settingList); 
      } 
     } 
    }); 
} 
+0

申し訳ありませんが、私は初心者ですが、 「新しいFindCallback ()をそのメソッドのパラメータとして渡してfindInBackgroundに渡す」という意味ですか? – Coder

+0

更新を参照してください –

+0

これはどのように動作するのですか教えてください。 – Coder

関連する問題