【问题标题】:Call function in main thread only when worker thread is done in Android仅当在 Android 中完成工作线程时才在主线程中调用函数
【发布时间】:2020-03-22 11:52:15
【问题描述】:

我无法理解如何为我在 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());
                }
            }
        }
    };
}

【问题讨论】:

标签: java android multithreading


【解决方案1】:

在单独的线程中调用您的 calculateMeanMagnitude() 和 predict() 方法,一旦它们都完成从该线程发送广播以更新您的 UI
在您的 Activity 课程的简历中注册此接收器

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());
            }
        }
    }
  }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多