簡體   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