-1

アプリで画像を含むカスタムリストビューを使用し、json URL からすべてのデータをロードしています。

私は onscrollistener() を作成しました

ユーザーがリストビューの一番下までスクロールすると、現在のデータの下にデータが自動的に追加されます。

しかし、私のデータがロードされているとき、リストビュー全体が2〜3秒間フリーズします。

何が悪いのかわからない??

これがAsyncTaskの私のコードです

private class BackgroundLoadMore extends AsyncTask<Void, Void, Void> {

          @Override
            protected void onPreExecute() {
                // Showing progress dialog before sending http request


            }

        protected Void doInBackground(Void... unused) {
            runOnUiThread(new Runnable() {
                public void run() {

                    LoadData();


                            list.setOnScrollListener(new EndlessScrollListener());
                }
            });
            return (null);
        }

        protected void onPostExecute(Void unused) {
            // On completing background task
            // closing progress dialog etc,.


        }
4

4 に答える 4

4

メイン UI スレッドで url から json データを取得する必要があります。これにより、システムによる UI の更新がブロックされ、フリーズが発生します。このようなネットワーク タスクをバックグラウンドで実行するには、AsyncTaskを使用します。

LoadData()asynctask の doInBackground() であるバックグラウンド スレッドで呼び出す必要があります。あなたの呼び出し runOnUIThread はそれを UI スレッドに戻しますが、それは望ましくありません。runOnUIThreadasynctask から呼び出しを削除します。

     protected Void doInBackground(Void... unused) {
        LoadData();

        return (null);
    }

   protected void onPostExecute(Void unused) {
        // On completing background task
        // closing progress dialog etc,.

        list.setOnScrollListener(new EndlessScrollListener());

    }
于 2012-07-26T11:24:01.043 に答える
1

LoadData();から移動

runOnUiThread(new Runnable() {
    public void run() {}
};
于 2012-07-26T11:37:57.647 に答える
0

おそらく、UI スレッド内でデータを読み込んでいます。

インターネットからの JSON データの読み込みなどの操作は遅いため (通常は 0.5 ~ 10 秒)、アプリのメイン スレッド内でそれを行うと、ユーザー インターフェイスはしばらくの間応答を停止します。Thread または AsyncTask を使用して JSON データを非同期にロードし、UI スレッドがユーザー入力 (リストのスクロールなど) に応答できるようにする必要があります。

私の提案は、AsyncTask を使用してデータをロードすることです。

ここにいくつかのリンクがあります:


編集

入れlist.setOnScrollListener(new EndlessScrollListener());list.notifyDatasetChanged();中にonPostExcecute();

于 2012-07-26T11:24:37.707 に答える
0

doInBackground はワーカー スレッドで実行されますが、その中で runOnUiThread を使用して UI の操作を開始します。

バックグラウンドスレッドでネットからすべてのデータをロードしてから、postExecuteでリストビューを更新する必要があります

于 2012-07-26T11:29:39.000 に答える