2015-11-03 18 views
0

嗯,我在我的庫存應用中遇到了一個問題。我正在嘗試從Parse中檢索庫存物品清單。這不是世界上最難做的事情。在這一點上,當我在Parse.com中清楚地看到我所請求的課程中有數據時,我不知道爲什麼數據會回到空白處。有任何想法嗎? (注意:我可以在沒有問題的情況下將項目添加到數據庫中......只是在檢索中)。從Parse.com檢索數據後,列表返回爲空?沒有錯誤信息?只是沒有數據?

MainActivity:

public class MainActivity extends AppCompatActivity { 

    private ImageView mAddButton; 
    private ImageView mBackButton; 
    private Inventory mInventory; 
    private RecyclerView mRecyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mAddButton = (ImageView) findViewById(R.id.addItemButton); 
     mBackButton = (ImageView) findViewById(R.id.backButton); 
     mBackButton.setVisibility(View.INVISIBLE); 
     mInventory = new Inventory(); 

     ParseUser user = ParseUser.getCurrentUser(); 
     if (user == null) { 
      navToLogin(); 
     } else { 
      Toast.makeText(MainActivity.this, "Welcome!", Toast.LENGTH_SHORT).show(); 
      getInventoryFromParse(); 
      Toast.makeText(MainActivity.this, mInventory.toString(), Toast.LENGTH_LONG).show(); 
     } 

     mAddButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       addItem(); 
      } 
     }); 
    } 


    private void updateView() { 
     mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     InventoryListAdapter adapter = new InventoryListAdapter(this, mInventory.getItemList()); 
     mRecyclerView.setAdapter(adapter); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(layoutManager); 
    } 

    private void addItem() { 
     Intent intent = new Intent(MainActivity.this, AddItemActivity.class); 
     startActivityForResult(intent, 1); 
    } 

    private void navToLogin() { 
     Intent intent = new Intent(this, LoginActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
      switch (requestCode) { 
       case (1): 
        updateView(); 
      } 
     } 
    } 

    public void getInventoryFromParse() { 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("Item"); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> objects, ParseException e) { 
       if (e == null) { 
        mInventory.setItemList(objects); 
       } else { 
        Toast.makeText(MainActivity.this, "There was an error.", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 
    } 
} 

Inventory類:

public class Inventory { 

    private List<ParseObject> mItemList; 

    public Inventory() { 
     mItemList = new ArrayList<>(); 
    } 

    public List<ParseObject> getItemList() { 
     return mItemList; 
    } 

    public void setItemList(List<ParseObject> itemList) { 
     mItemList = itemList; 
    } 

    public void addItem(ParseObject item) { 
     mItemList.add(item); 
    } 

    @Override 
    public String toString() { 
     return "Inventory{" + 
       "mItemList=" + mItemList + 
       '}'; 
    } 
} 

回答

1

查詢創建它在後臺運行一個新的線程,然後主線程繼續前進,退出功能,以及查詢在您打印出庫存時仍未完成。主線程將mInventory打印到字符串時,尚未調用setInventory。

這就是爲什麼你的代碼不工作。

至於解決方案,我不確定Android開發工具包是如何工作的,但是我的建議是讓代碼按照它的方式拆分,這會讓getInventoryFromParse有一個返回類型,並且返回查詢回調。我不確定是否會因爲主線程到達函數的末尾而拋出錯誤...如果這不起作用,您將不得不重寫代碼,以便在項目之後發生任何事情取回發生在回調內部。

+0

不得不採用第二種解決方案。謝天謝地,這不是太多的工作。將updateView()方法放在getInventoryFromParse()方法內,並且它都可以正常執行。謝謝您的幫助! – Wilson

+0

沒問題。對於所有的同步方法調用,解析可能會非常棘手。我喜歡JavaScript的承諾。我下載了一個iOS庫,允許您撥打類似於承諾的電話,但我還沒有使用它。我敢打賭,Android有一些類似的東西。 Promises基本上允許你將對方的同步函數調用相互連接起來,以確保下一個函數在前一個函數完成之後才能被調用。非常方便。如果你寫了很多你自己的雲代碼,你應該使用它們。 –

+0

我龔不得不看看。可以讓生活變得更容易。再次感謝傑克! – Wilson

相關問題