Android 额外的线程和 Looper
Android additional threads and Looper
我正在编写一个 Android 应用程序,它从 SQLite Database
读取数据,然后在下一个屏幕上显示数据。每当我对数据库进行查询时,我都会收到一条错误消息,指出主线程上正在完成太多工作。
然后我将查询放在一个新线程中:
(new Thread()
{
public void run()
{
Looper.prepare();
try
{
FPJobCardWizard data = dbHelperInstance.loadFPJobCardWizardFull(fitmentHash);
wState.fitmentItemSet(data.fitmentItemGet());
} catch (Exception e) {e.printStackTrace();}
Looper.loop();
}
}).start();
现在 gui/main 线程在查询完成之前完成它的操作,因此 data
变量仍然为空。我阅读了一些帖子和 API 文档,似乎我需要使用 Looper
(这似乎是正确的解决方法)但我从未使用过 Looper 并且似乎无法使用它工作。
请你检查上面的代码并指导我正确的方向。
提前谢谢大家。
此处的最佳选择是使用 AsyncTask,因为它可以让您在后台线程中执行所有后台工作,然后在生成结果时使用 [=25] 应用它=] 线程:
因此,如 AsyncTask
的生命周期中所述,您可以在方法 doInBackground()
中完成所有后台工作,然后在 UI 方法中完成所有工作方法 onPostExecute()
将根据生命周期从 doInBackground()
方法获取结果后执行,并将您的手更多地放在 AsyncTask
上,看看 this example其中提供了以下示例代码:
public class AsyncTaskTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// This starts the AsyncTask
// Doesn't need to be in onCreate()
new MyTask().execute("my string paramater");
}
// Here is the AsyncTask class:
//
// AsyncTask<Params, Progress, Result>.
// Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
// Progress – the type that gets passed to onProgressUpdate()
// Result – the type returns from doInBackground()
// Any of them can be String, Integer, Void, etc.
private class MyTask extends AsyncTask<String, Integer, String> {
// Runs in UI before background thread is called
@Override
protected void onPreExecute() {
super.onPreExecute();
// Do something like display a progress bar
}
// This is run in a background thread
@Override
protected String doInBackground(String... params) {
// get the string from params, which is an array
String myString = params[0];
// Do something that takes a long time, for example:
for (int i = 0; i <= 100; i++) {
// Do things
// Call this to update your progress
publishProgress(i);
}
return "this string is passed to onPostExecute";
}
// This is called from background thread but runs in UI
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// Do things like update the progress bar
}
// This runs in UI when background thread finishes
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// Do things like hide the progress bar or change a TextView
}
}
}
我正在编写一个 Android 应用程序,它从 SQLite Database
读取数据,然后在下一个屏幕上显示数据。每当我对数据库进行查询时,我都会收到一条错误消息,指出主线程上正在完成太多工作。
然后我将查询放在一个新线程中:
(new Thread()
{
public void run()
{
Looper.prepare();
try
{
FPJobCardWizard data = dbHelperInstance.loadFPJobCardWizardFull(fitmentHash);
wState.fitmentItemSet(data.fitmentItemGet());
} catch (Exception e) {e.printStackTrace();}
Looper.loop();
}
}).start();
现在 gui/main 线程在查询完成之前完成它的操作,因此 data
变量仍然为空。我阅读了一些帖子和 API 文档,似乎我需要使用 Looper
(这似乎是正确的解决方法)但我从未使用过 Looper 并且似乎无法使用它工作。
请你检查上面的代码并指导我正确的方向。
提前谢谢大家。
此处的最佳选择是使用 AsyncTask,因为它可以让您在后台线程中执行所有后台工作,然后在生成结果时使用 [=25] 应用它=] 线程:
因此,如 AsyncTask
的生命周期中所述,您可以在方法 doInBackground()
中完成所有后台工作,然后在 UI 方法中完成所有工作方法 onPostExecute()
将根据生命周期从 doInBackground()
方法获取结果后执行,并将您的手更多地放在 AsyncTask
上,看看 this example其中提供了以下示例代码:
public class AsyncTaskTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// This starts the AsyncTask
// Doesn't need to be in onCreate()
new MyTask().execute("my string paramater");
}
// Here is the AsyncTask class:
//
// AsyncTask<Params, Progress, Result>.
// Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
// Progress – the type that gets passed to onProgressUpdate()
// Result – the type returns from doInBackground()
// Any of them can be String, Integer, Void, etc.
private class MyTask extends AsyncTask<String, Integer, String> {
// Runs in UI before background thread is called
@Override
protected void onPreExecute() {
super.onPreExecute();
// Do something like display a progress bar
}
// This is run in a background thread
@Override
protected String doInBackground(String... params) {
// get the string from params, which is an array
String myString = params[0];
// Do something that takes a long time, for example:
for (int i = 0; i <= 100; i++) {
// Do things
// Call this to update your progress
publishProgress(i);
}
return "this string is passed to onPostExecute";
}
// This is called from background thread but runs in UI
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// Do things like update the progress bar
}
// This runs in UI when background thread finishes
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// Do things like hide the progress bar or change a TextView
}
}
}