繁体   English   中英

仅当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM