Java 仅当工作线程在Android中完成时,才在主线程中调用函数

Java 仅当工作线程在Android中完成时,才在主线程中调用函数,java,android,multithreading,Java,Android,Multithreading,我很难理解如何在Android中找到解决线程问题的方法。因此,下面的当前(简化)代码基本上是在主线程上运行的,这给我带来了一些问题,因为方法calculateMeanMagnite()和predict()很慢,因此会按预期阻塞UI。 我想做的是在一个单独的线程中计算这两个函数,完成后在UI线程中调用updateData() 我真的不知道如何从语法的角度做到这一点,也不知道如何避免在updateData()之前忙着等待,因为这也会阻塞UI线程 public class MainActivity e

我很难理解如何在Android中找到解决线程问题的方法。因此,下面的当前(简化)代码基本上是在主线程上运行的,这给我带来了一些问题,因为方法
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线程和工作线程。