跳过 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);
这不会使问题消失,因为主线程仍然需要等待 t1
和 t2
。关于如何解决这个问题有什么设计建议吗?
您永远不应在 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()
我知道网络调用和 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);
这不会使问题消失,因为主线程仍然需要等待 t1
和 t2
。关于如何解决这个问题有什么设计建议吗?
您永远不应在 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()