跳过 130+ 帧,主线程上的工作太多

Skipped 130+ frames, too much work on the main thread

我知道网络调用和 sqlite 访问最好通过工作线程来完成。在我的例子中,我的网络调用是通过 Okhttp 完成的,而 sqlite 是通过一个工作线程完成的。

这就是我的问题。我有一个 main activity,它包含用户在列表视图中购买的所有股票。每次创建这个新的 activity 时,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。关于如何解决这个问题有什么设计建议吗?

您永远不应在 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()