0

私はAsyncTaskバックグラウンド処理を行うために使用しています。つまり、サーバーからデータをフェッチしてListindoInBackground()メソッドに保存しています。この保存されたデータを で使用していonPostExecute()ます。

私が直面している問題は、実行が完了するonPostExceute()前に実行されることdoInBackground()です。

誰かが何が間違っているのかを提案できますか?

コード:

AsyncTask<Void, Void, Void> read= new AsyncTask<Void, Void, Void>() {

        ProgressDialog progress= new ProgressDialog(LastData.this);
        ArrayList<String> testData;
        DBAdapter db;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progress.setTitle("Please Wait");
            testData= new ArrayList<String>();
            db= new DBAdapter(LastData.this);
            progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progress.setMessage("Fetching Data !!");
            progress.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            ParseQuery query = new ParseQuery("Details");
            query.findInBackground(new FindCallback() {
                public void done(List<ParseObject> dataList,
                        ParseException e) {
                    if (e == null) {
                        Log.d("Details", "Retrieved " + dataList.size()
                                + " scores");
                        for (int idx = 0; idx < dataList.size(); idx++) {
                            data.add(dataList.get(idx).get("fname")
                                    .toString());
                        }
                    } else {
                        System.out.println(e.getMessage());
                    }

                    for (int idx = 0; idx < data.size(); idx++) {
                        testData.add(data.get(idx));
                    }

                    System.out.println("size inside is " + testData.size());
                }

            });

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            progress.dismiss();

            Toast.makeText(LastData.this, "Size is "+testData.size(), Toast.LENGTH_LONG).show();
        }
    };

read.execute();

ToastonPostExecute()メソッドが実行される前でもメッセージが表示されますdoInBackground

4

2 に答える 2

1

onPostExceuteタスクが完了する前に が実行された場合はdoInBackground、おそらくasynchronous内で呼び出しを行っていることを意味しますdoInBackground。より具体的な回答のコードを投稿してください。

編集:

問題は、findInBackground非同期で実行されるため、呼び出すために AsynTask が必要ないことです。スレッドをブロックせずに既に実行されており、FindCallback何かが見つかったときに呼び出されます。したがって、AsyncTask を削除し、次のように呼び出す場所を見つけてread.execute(...)置き換える必要があります。

1)そこからコードonPreExecute()を挿入する 2) からコードを最後まで挿入するdoInBackground()
onPostExecuteFindCallback()

例:

        /*...*/
        progress.setTitle("Please Wait");
        testData= new ArrayList<String>();
        db= new DBAdapter(LastData.this);
        progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progress.setMessage("Fetching Data !!");
        progress.show();
        ParseQuery query = new ParseQuery("Details");
        query.findInBackground(new FindCallback() {
            public void done(List<ParseObject> dataList,
                    ParseException e) {
                if (e == null) {
                    Log.d("Details", "Retrieved " + dataList.size()
                            + " scores");
                    for (int idx = 0; idx < dataList.size(); idx++) {

                        data.add(dataList.get(idx).get("fname")
                                .toString());
                    }

                } else {
                    System.out.println(e.getMessage());
                }


                for (int idx = 0; idx < data.size(); idx++) {

                    testData.add(data.get(idx));
                }
                System.out.println("size inside is " + testData.size());
                progress.dismiss();
                Toast.makeText(LastData.this, "Size is "+testData.size(), Toast.LENGTH_LONG).show();
            }

        });
        /*...*/
于 2012-06-26T15:31:47.820 に答える
0

のように見えます

query.findInBackground(new FindCallback() { ... }

ある種の非同期タスクです。方法があると思います

 query.find() 

これは同期です。

于 2012-06-26T15:59:25.443 に答える