2017-01-23 53 views
0

如何从数据库检索数据并将其推送到我的列表视图? 我想为此使用asynctask。更新ListView过程中的AsyncTask错误

我已经使用过这段代码,但是每当我运行这段代码时,我的应用程序都会崩溃。 idk为什么因为当我推送数据到我的分贝然后它工作正常。但是当我检索,然后我得到错误。

public class GetAsync extends AsyncTask<Void,ArrayList<Task>,String> { 

private Context context; 
private ListView listView; 
ArrayAdapter<Task> tasks; 

public GetAsync(Context context,ListView listview) { 
    this.context = context; 
    this.listView = listview; 
} 


@Override 
protected String doInBackground(Void... voids) { 
    TaskDbHelper db = new TaskDbHelper(context); 
    tasks.addAll(db.getTasks()); 
    return "werkt"; 
} 



@Override 
protected void onPreExecute() { 
    tasks = (ArrayAdapter<Task>) listView.getAdapter(); 
} 

@Override 
protected void onPostExecute(String aVoid) { 
    super.onPostExecute(aVoid); 
} 

}

lvItems = (ListView) findViewById(R.id.lvItems); 
    new GetAsync(this,lvItems).execute(); 
+1

您能否提供导致崩溃的异常的堆栈跟踪? –

回答

1

尝试

public class GetAsync extends AsyncTask<Void,ArrayList<Task>,List<Task>> { 

    private Context context; 
    private ListView listView; 
    ArrayAdapter<Task> tasks; 

    public GetAsync(Context context, ListView listview) { 
     this.context = context; 
     this.listView = listview; 
    } 


    @Override 
    protected List<Task> doInBackground(Void... voids) { 
     TaskDbHelper db = new TaskDbHelper() 
     return db.getTasks(); 
    } 



    @Override 
    protected void onPreExecute() { 
     tasks = (ArrayAdapter<Task>) listView.getAdapter(); 
    } 

    @Override 
    protected void onPostExecute(List<Task> tasks) { 
     tasks.addAll(tasks); 
    } 
} 

这是因为你不是UI线程同时修改视图上。所以你想更新onPostExecute中的适配器,因为它在启动AsyncTask的线程上运行(我假设它是UI线程)

+0

如果我是对的,他不会更新UI。他只是将它们添加到列表中。我可能是错的,这也触发了用户界面更新,但不是我知道的 – creativecreatorormaybenot

+0

它可以调用'notifyDataSetChanged' https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter .java#L217这将需要在UI线程 – Ryan

+0

是的。也想回答移动到UI线程,但我想这是答案 – creativecreatorormaybenot