私の知る限りでは、新しいスレッドで作成されるランナブルを実装しました。ただし、スレッドはバックグラウンドで実行されていないようで、ランナブル内で実行されたアクションにより、重いアクションでUIが停止します。
下記参照:
_custListLoadThread = new Thread(loadRunnable);
custListLoadThread.run();
private Runnable loadRunnable = new Runnable()
{
@Override
public void run()
{
Android.os.Process.setThreadPriority(Android.os.Process.THREAD_PRIORITY_BACKGROUND);
Gen.popup("TEST"); // Creates a toast pop-up.
// This is to know if this runnable is running on UI thread or not!
try
{
customers = Db.BasicArrays.getCustomers(CustomApp.Session.businessCode, empId);
runOnUiThread(new Runnable() {
@Override
public void run() {
populate();
setCustListVisible(true);
loading = false;
}
});
}
catch (final Exception ex)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
Gen.popup(ex.getMessage());
}
});
}
}
};
_
ただし、このコードはバックグラウンドで実行されず、UIスレッドで実行されているように見えます。これを確認するためにGen.popup("TEST");
という行を配置しました(非UIスレッドでtoast
ポップアップを呼び出すとエラーが発生するはずです)。
このランナブルがバックグラウンドで実行されない理由についてのアイデアはありますか?
custListLoadThread = new Thread(loadRunnable);
custListLoadThread.start();
現在のスレッドでrun()メソッドを呼び出すのではなく、スレッドを開始する必要があります。
UIで何もしないバックグラウンドスレッドでコードを実行する場合:
Runnable runnable = new Runnable() {
@Override
public void run() {
//your action
}
};
AsyncTask.execute(runnable);
もちろん前に書いたように、UIスレッドから独立した新しいスレッドを作成することもできます。
new Thread(runnable).start();
あなたの例では、UI要素を更新したいので、AsyncTask
を使用することをお勧めします(UIスレッドから呼び出す必要があります!):
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
// your async action
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
// update the UI (this is executed on UI thread)
super.onPostExecute(aVoid);
}
}.execute();