0

スプラッシュ画面で Parse.com からデータを取得しようとしています。

DoInBackground メソッドでクエリを作成し、オブジェクト ベクター (他のクラスにある) で取得したすべてのオブジェクトを追加します。

MainActivty に移動すると、すべてのデータが失われます。

これが私のコードです:

private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{


    @Override
    protected Vector<PartyObj> doInBackground(Void... params)  
    {  
        ParseQuery query = new ParseQuery("partyObj");
        query.whereExists("Name");
        query.findInBackground(new FindCallback() {

            @Override
            public void done(List<ParseObject> mNameList, ParseException e) {
                 if (e == null) {   
                       adapter.partyVector = new Vector<PartyObj>();               
                        for(int i=0; i<mNameList.size(); i++){
                            PartyObject party = new PartyObject();
                            party.setIndex(i);
                            party.setmName(mNameList.get(i).getString("Name").toString());
                            adapter.partyVector.add(party);

                 }
                         }else {
                        Log.d("mNameList", "Error: " + e.getMessage());                        
                    }

            }
        });
        return adpater.partyVector;  
    }  


    @Override
    protected void onPostExecute(Vector<PartyObj> result) {
        progressDialog.dismiss();
        setContentView(R.layout.activity_main_menu);            
    }

}
4

2 に答える 2

0

AsyncTask をすべて間違って使用しているようです。query.findInBackground() は、非同期呼び出しを伝えることができる限りであるため、基本的にある非同期呼び出しを別の非同期呼び出しでラップしています。これの問題は、query.findInBackground() の直後にコードの実行が続くため、doInBackground() メソッドが終了することです。非同期タスクが終了するとすぐにメイン アクティビティに移動するため、 query.findInBackground() がまだ終了していない可能性があります (したがって、空のリストまたは部分的なリストが生成されます)。

非同期呼び出しですべてをラップする必要があると本当に確信していますか? 次のいずれかを行います

ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");

実行に時間がかかるか、作業の大部分が既に非同期の findInBackground() 呼び出しに含まれていますか? もしそうなら、AsyncTask をスキップして、FindCallback の done() メソッドでビュー遷移を行うと思います。

更新:私はParseQueryを読んだことがありますが、それは明確に言っています:

ネットワーク操作は呼び出し元のスレッドをブロックしないため、通常はコールバック メソッドを使用することをお勧めします。ただし、場合によっては、呼び出しスレッドをブロックする find、get、または count 呼び出しを使用する方が簡単な場合があります。たとえば、アプリケーションが作業を実行するバックグラウンド タスクを既に生成している場合、そのバックグラウンド タスクはブロッキング呼び出しを使用して、コールバックのコードの複雑さを回避できます。

そして、findInBackground()では、次のことが明確に述べられています。

バックグラウンド スレッドでサーバーからこのクエリを満たす ParseObjects のリストを取得します。コードがすでにバックグラウンド スレッドで実行されている場合を除き、これは find() を使用するよりも望ましい方法です。

既にすべてを AsyncTask にラップしているため、findInBackground( は既にバックグラウンド スレッドで実行されているため、非同期タスクを完全にスキップするか、ブロックしているfind()メソッドに切り替える必要があります。

AsyncTask を使用せずに async findInBackground() を使用する例:

ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
query.findInBackground(new FindCallback() {

    @Override
    public void done(List<ParseObject> mNameList, ParseException e) {
        if (e == null) {   
            adapter.partyVector = new Vector<PartyObj>();               
            for(int i=0; i<mNameList.size(); i++){
                PartyObject party = new PartyObject();
                party.setIndex(i);
                party.setmName(mNameList.get(i).getString("Name").toString());
                adapter.partyVector.add(party);
            }

            progressDialog.dismiss();
            setContentView(R.layout.activity_main_menu);                    
        }
        else {
            Log.d("mNameList", "Error: " + e.getMessage());                        
        }

    }
});

AsyncTask とブロッキング find() の例

private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{

    @Override
    protected Vector<PartyObj> doInBackground(Void... params)  
    {  
        ParseQuery query = new ParseQuery("partyObj");
        query.whereExists("Name");
        Vector<PartyObject> v = new Vector<PartyObject();
        try {
            List<ParseObject> queryResult = query.find();
            for(ParseObject po : queryResult) {
                PartyObject party = new PartyObject();
                party.setIndex(partyVector.size());
                party.setmName(po.getString("Name").toString());
                v.add(party);
            }
        }
        catch(ParseException e) {
            Log.d("mNameList", "Error: " + e.getMessage());
        }
        return v;
    }

    @Override
    protected void onPostExecute(Vector<PartyObj> result) {
        adapter.partyVector.addAll(result);
        progressDialog.dismiss();
        setContentView(R.layout.activity_main_menu);            
    }
}
于 2013-05-20T20:16:13.350 に答える