-3

Androidアクティビティのビューを自動的に更新しようとして問題が発生しました。アプリケーションはチャットのようなメッセージを表示します。ListViewを使用して、ArrayAdapterでメッセージを配置しています。

この方法を使用してListViewを更新します

public void loadMessages() {
ArrayList<String> messages = this.dbHelper.getMessages();
conversationArrayAdapter.clear();
conversationArrayAdapter.addAll(messages);
conversationArrayAdapter.notifyDataSetChanged();
}

私の考えは、その方法を呼び出すスレッドを配置することですが、これを実行しようとすると、次のエラーが発生します。

ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。

4

4 に答える 4

1

Thread から UI 要素にアクセスまたは更新しようとしているためです。このエラーを回避するには、次 のようにスレッドから UI を更新するためにrunOnUiThreadを使用する必要があります。

Your_Current_Activity.this.runOnUiThread(new Runnable() {

  @Override
    public void run() {

        // Update UI here    
        loadMessages();                             
    }
});

2番目の解決策は、スレッドの代わりに AsyncTaskを使用することです

于 2013-03-01T12:43:54.077 に答える
1

このコードを使用します。

public class MainActivity extends Activity
{
    private Timer autoUpdate;

    @Override
     public void onResume()
     {
        super.onResume();
        autoUpdate = new Timer();
        autoUpdate.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                runOnUiThread(new Runnable()
                {
                    public void run()
                    {
                        updateScore();
                    }
                });
            }
        }, 0, 5000); // updates each 5 seconds
     }


     @Override
     public void onPause()
     {
         autoUpdate.cancel();
         super.onPause();
     }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        // initialize view layout
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cleanermain);
        super.onResume();
    }


        private void updateScore()
        {
            // decide output
            // update cricket score
        }
}
于 2013-03-01T12:46:35.280 に答える
0

UI は、UI (メイン) スレッドからのみ更新する必要があります。AsyncTask を使用したソリューションを次に示します。

public void asyncCallWithSchedule() {
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                        public void run() {
                            try {
                                new SearchAsync().execute(txtSearch.getText().toString());
                            }
                        });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 2000);
        }
}

AsyncTask クラス:

private class SearchAsync extends
AsyncTask < String, Object, List < Users >> {

    @Override
    protected List < Users > doInBackground(String...params) {
        // Call DB here   
        return null;
    }

    @Override
    protected void onPostExecute(List < Users > result) {
        super.onPostExecute(result);
        // Update UI here
    }
}
于 2013-03-01T12:46:56.927 に答える
0

単純:

public void loadMessages() {
    ArrayList<String> messages = this.dbHelper.getMessages();
    conversationArrayAdapter.clear();
    conversationArrayAdapter.addAll(messages);

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        public void run() {
            conversationArrayAdapter.notifyDataSetChanged();
        }
    });
}
于 2013-03-01T12:47:15.390 に答える