从Parse.com检索数据后,列表返回为空?没有错误消息?没有数据?

时间:2015-11-03 01:12:22

标签: android object parse-platform

我的库存应用中遇到了一个问题。我正在尝试从Parse检索库存项目列表。这不是世界上最难做到的事情。在这一点上,当我在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();
                }
            }
        });
    }
}

库存类:

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 个答案:

答案 0 :(得分:1)

查询创建一个在后台运行的新线程,然后您的主线程继续运行,退出该函数,并且当您打印出库存时查询仍未完成。当主线程将mInventory打印到字符串时,尚未调用setInventory。

这就是您的代码无效的原因。

至于解决方案,我不确定Android开发工具包是如何工作的,但我的建议是让你的代码分开,就像让getInventoryFromParse有一个返回类型,并在查询中调用return打回来。我不确定是否会因为主线程到达函数结束而抛出错误...如果这不起作用,则必须重写代码,以便在项目之后需要发生的任何事情取回发生在回调中。