跳过130多帧,在主线程

时间:2016-05-19 17:48:18

标签: android multithreading sqlite okhttp3

我知道网络调用和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); 

这不会使问题消失,因为主线程仍然需要等待t1t2。关于如何解决这个问题的任何设计建议?

1 个答案:

答案 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()