![](/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.