Java 仅当工作线程在Android中完成时,才在主线程中调用函数
我很难理解如何在Android中找到解决线程问题的方法。因此,下面的当前(简化)代码基本上是在主线程上运行的,这给我带来了一些问题,因为方法Java 仅当工作线程在Android中完成时,才在主线程中调用函数,java,android,multithreading,Java,Android,Multithreading,我很难理解如何在Android中找到解决线程问题的方法。因此,下面的当前(简化)代码基本上是在主线程上运行的,这给我带来了一些问题,因为方法calculateMeanMagnite()和predict()很慢,因此会按预期阻塞UI。 我想做的是在一个单独的线程中计算这两个函数,完成后在UI线程中调用updateData() 我真的不知道如何从语法的角度做到这一点,也不知道如何避免在updateData()之前忙着等待,因为这也会阻塞UI线程 public class MainActivity e
calculateMeanMagnite()
和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());
}
}
}
};
}
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
}
私有双计算平均星等(ArrayList加积,布尔isAcc){
返回0.0;
}
专用最终广播接收器mReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
Bundle data=intent.getExtras();
if(data==null)返回;
if(data.containsKey(Constants.WindowBroadcastExtraName)){
ScanResult扫描=(ScanResult)data.getSerializable(Constants.WindowBroadcastExtraName);
如果(扫描!=null){
double MeanMagnite=CalculateMeanMagnite(scan.getAccuradings(),true);
浮动[]预测=预测(平均震级);
updateData(isStill,predictions,scan.getLocationScans());
}
}
}
};
}
在单独的线程中调用calculateMeanMagnitude()和predict()方法,两个方法完成后,从该线程发送s广播以更新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);
}
}
}
在单独的线程中调用calculateMeanMagnitude()和predict()方法,两个方法完成后,从该线程发送s广播以更新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);
}
}
}
我建议您将代码转换为
kotlin
并使用coroutines
一个简单的解决方案用于通信UI线程和工作线程。我建议您将代码转换为kotlin
并使用coroutines
一个简单的解决方案用于通信UI线程和工作线程。