-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 元素。为避免此错误,您将使用 runOnUiThread从 Thread 更新 UI:

Your_Current_Activity.this.runOnUiThread(new Runnable() {

  @Override
    public void run() {

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

第二个解决方案是使用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);
        }
}

异步任务类:

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 回答