![](/img/trans.png)
[英]How to get notification from worker thread to main thread when worker thread done with its work in android
[英]Call function in main thread only when worker thread is done in Android
我在理解如何為我的 Android 線程問題找到解決方案時遇到了麻煩。 所以基本上下面的當前(簡化)代碼正在主線程上運行,這給我帶來了一些問題,因為方法calculateMeanMagnitude()
和predict()
很慢,因此會按預期阻塞 UI。
我想要做的是在一個單獨的線程中計算這兩個函數,一旦我完成,在我的 UI 線程中調用updateData()
。
我真的不知道如何從語法的角度以及如何避免在updateData()
之前忙等待,因為這也會阻塞 UI 線程。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
}
private double calculateMeanMagnitude(ArrayList<SensorReading> accReadings, boolean isAcc) {
return 0.0;
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
if (data == null) return;
if (data.containsKey(Constants.WindowBroadcastExtraName)) {
ScanResult scan = (ScanResult) data.getSerializable(Constants.WindowBroadcastExtraName);
if (scan != null) {
double meanMagnitude = calculateMeanMagnitude(scan.getAccReadings(), true);
float[] predictions = predict(meanMagnitude);
updateData(isStill, predictions, scan.getLocationScans());
}
}
}
};
}
在單獨的線程中調用您的 calculateMeanMagnitude() 和 predict() 方法,一旦它們都完成從該線程發送廣播以更新您的 UI
在您的活動類的簡歷中注冊此接收器
IntentFilter = new IntentFilter();
mIntentFilter.addAction(any action string);
registerReceiver(mReceiver, mIntentFilter);
用於在單獨的線程上執行您的方法的 Asyntask
private class Find extends AsyncTask<Void, Void, YourReusltfromthesemethods> {
@Override
protected YourReusltfromthesemethods doInBackground(Void... voids) {
calculateMeanMagnitude();
predict();
}
@Override
protected void onPostExecute(YourReusltfromthesemethods result) {
super.onPostExecute(aVoid);
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("any action string");
broadcastIntent.putExtra("Data", "Broadcast Data");
sendBroadcast(broadcastIntent);
}
}
}
並在您的接收器的 onReceiver 方法中更新您的 ui
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("any action string")){
Bundle data = intent.getExtras();
if (data == null) return;
if (data.containsKey(Constants.WindowBroadcastExtraName)) {
ScanResult scan = (ScanResult) data.getSerializable(Constants.WindowBroadcastExtraName);
if (scan != null) {
double meanMagnitude = calculateMeanMagnitude(scan.getAccReadings(), true);
float[] predictions = predict(meanMagnitude);
updateData(isStill, predictions, scan.getLocationScans());
}
}
}
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.