【问题标题】:How to use threads when retrieving data from database从数据库中检索数据时如何使用线程
【发布时间】:2015-08-10 00:30:52
【问题描述】:

所以这是我试图用线程实现的方法,但是在运行它时它一直在崩溃,我不知道为什么.. logcat 不会像当某些东西崩溃时那样向我显示错误,这让我非常困惑。 .

所以基本上我在这里尝试做的是开始我的活动,当用户查看活动时,它开始在后台填充列表,如果这有助于解释我试图完成的事情。

Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        populateExerListView(exercises);
    }
};

public void loadDataFromDatabase(){
    Runnable r = new Runnable() {
        @Override
        public void run() {
            exercises = dbh.getAllExercises(bodypart_chosen);
            handler.sendEmptyMessage(0);
        }
    };

public void populateExerListView(final ArrayList<AdapterExercisesList.Exercise> exercises){

    ListAdapter edsAdapter = new AdapterExercisesList(this, exercises);
    exerciseListView = (ListView) findViewById(R.id.exerciseListView);

    exerciseListView.setAdapter(edsAdapter);

    exerciseListView.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    int pos = (Integer) view.getTag();
                    //gets the bodypart by passing in the pos
                    String exercise_chosen = exercises.get(pos).get_exerciseName();

                    Calendar c = Calendar.getInstance();
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String formattedDate = df.format(c.getTime());
                    exerciseClicked(exercise_chosen, formattedDate);
                }
            }
    );
}

【问题讨论】:

  • 如果 logcat 没有显示任何相关信息,你怎么知道应用程序崩溃
  • 你错过了 loadDataFromDatabase 方法的右括号。无论如何,请参阅下面的答案

标签: android multithreading sqlite


【解决方案1】:

你定义了可运行但你从不将它传递给线程,

你需要改变这个:

public void loadDataFromDatabase(){
    Runnable r = new Runnable() {
        @Override
        public void run() {
            exercises = dbh.getAllExercises(bodypart_chosen);
            handler.sendEmptyMessage(0);
        }
    };

对此:

public void loadDataFromDatabase(){

    new Thread(new Runnable() {
        @Override
        public void run() {
            exercises = dbh.getAllExercises(bodypart_chosen);
            handler.sendEmptyMessage(0);
        }
    }).start();

}//end method

【讨论】:

  • 啊...我以为就这样了。差不多修好了?嗯,我该如何解释这个......当我第一次尝试填充我的列表时它工作得很好,但是在它被填充之后并且当我单击后退按钮并尝试再次单击列表视图时。它在我的模拟器上崩溃,不幸的是“应用程序名称”已停止。但是,当我查看我的 logcat 时,我没有看到任何红线
  • 可能是在 logcat 中启用了错误消息过滤。您需要禁用它,以便您可以看到错误消息。将过滤器设置为“全部”
  • 我将它设置为“无过滤器”,但我仍然看不到它.. :(
  • 对了,你为什么用int pos变量?你应该使用onItemClick参数列表中的int position变量
  • 啊,好点,那是我做过的类似的事情,我只是复制了一些东西,忘了把那个拿出来
猜你喜欢
  • 2016-08-30
  • 2021-12-31
  • 2019-05-30
  • 2020-08-03
  • 1970-01-01
  • 2018-09-04
  • 2018-09-11
  • 1970-01-01
相关资源
最近更新 更多