我知道网络调用和sqlite访问最好通过工作线程完成。在我的例子中,我的网络调用是通过Okhttp完成的,sqlite是通过一个工作线程完成的。
所以这是我的问题。我有一个主要活动,用于保存用户在列表视图中购买的所有股票。每次创建此新活动时,onCreate
方法将遍历数据库中的库存并逐个更新,然后更新列表视图。
这当然会给主线带来太多压力。但我的问题是如何更好地设计?现在我在onCreate
:
Thread t1 = new Thread(new Runnable{
@Override
public void run(){
// access sqlite
positionsArray = retrieveStocks();
}
});
t1.start();
t1.join(); //try catch omitted
Thread t2 = new Thread(new Runnable{
@Override
public void run(){
// use Okhttp to get data
positionsArray = refreshStocks();
}
});
t1.start();
t2.join(); //try catch omitted
adapter = new PositionsAdapter(this, positionsArray);
listview.setAdapter(adapter);
这不会使问题消失,因为主线程仍然需要等待t1
和t2
。关于如何解决这个问题的任何设计建议?
答案 0 :(得分:1)
你永远不应该在ui线程上调用thread.join(),因为它会暂停应用程序。您可以使用异步任务执行此操作AsyncTask Android example
ProgressDialog progress;
private class DoNetworking extends AsyncTask<Void, Void, PosArray> {
@Override
protected PosArray doInBackground() {
positionsArray = retrieveStocks();
positionsArray = refreshStocks();
PosArray positionsArray;
}
@Override
protected void onPostExecute(PosArray positionsArray) {
adapter = new PositionsAdapter(this, positionsArray);
listview.setAdapter(adapter);
progress.dismiss();
}
}
progress = ProgressDialog.show(this, "dialog title","dialog message", true);
new DoNetworking().execute()