Android - Hoe waarde weergeven op AsyncTask

Ik heb gewerkt aan een tuner-app voor Android, maar het kost me moeite om de fundamentele frequentie te krijgen.

Er zijn twee mogelijke problemen: 1) Ik bereken de fundamentele frequentie niet correct. 2) Ik geef deze waarde niet correct door, zodat deze in de gebruikersinterface kan worden weergegeven.

Dankzij Craigy heb ik het AsyncTask met succes geïmplementeerd, omdat ik continu een aantal gegevens kon doorgeven. Nu moet ik gewoon de juiste waarde krijgen om te verschijnen.

Hier is het AsyncTask:

protected class Tune extends AsyncTask
{
    protected void onPreExecute()
    {
        super.onPreExecute();
        btnTune.setText("Stop Tuning");
    }

    protected Double doInBackground(Double... params)
    {


        while(tuning)
        {
            try{


                acquire();
                hello = computeFFT();
                publishProgress(hello);
                //Thread.sleep(1);
            } catch(Exception e) {

            }

        }

        return 100.0;
    }

    protected void onProgressUpdate(Double...values)
    {
        super.onProgressUpdate(values);

                //DecimalFormat d = new DecimalFormat("#3.65");
                freq.setText(values + " Hz");;



    }

    protected double onPostExecute(Double...hello)
    {
        tuning = false;
        freq.setText("STOP!");
        return 75.0;
    }
}

Ik denk dat het correct is ingesteld, maar om de een of andere reden kan ik niets meer laten zien op publishProgress en onProgressUpdate. Wat is er mis? Hoe moet ik de gebruikersinterface bijwerken. Ik liet het een tijdje werken, maar niet meer.

Dit is mijn FFT:

public double computeFFT(){

    //Conversion from short to float
            float[] micBufferData = new float[buffer];//size may need to change
            final int bytesPerSample = 2;//As it is 16bit PCM
            final float amplification = 50;//choose a number as you like
            for (int index = 0, floatIndex = 0; index < buffer - bytesPerSample + 1; index += bytesPerSample, floatIndex++) {
                float sample = 0;
                for (int b = 0; b < bytesPerSample; b++) {
                    int v = audioData[index + b];
                    if (b < bytesPerSample - 1 || bytesPerSample == 1) {
                        v &= 0xFF;
                    }
                    sample += v << (b * 8);
                }
                float sample32 = amplification * (sample/32768);
                micBufferData[floatIndex] = sample32;
            }
    sampleRate = sampleRateInHz;

    //Take FFT of float data
    fftgdx.forward(micBufferData);

    //Fill in imaginary and real arrays from FFT data
    tmpi = fftgdx.getImaginaryPart();
    tmpr = fftgdx.getRealPart();

    //Create array of magnitude = sqrt(real*real + imag*imag)
    for(int i=0;i max_magnitude)
          max_magnitude = mag[i];
          max_index = i;
      }

     //convert index of largest peak to frequency
      frequency = (max_index*sampleRateInHz)/(buffer);

      return frequency;
}

Van alles wat ik heb gelezen en bestudeerd, lijkt dit goed te gaan. Zie je er goed uit? Geef ik de waarde correct terug?

Bedankt voor je hulp. Het wordt zeer gewaardeerd :)

0

3 antwoord

Ik zie geen probleem met onProgressUpdate ... u overschrijft echter onPostExecute niet, omdat het retourtype void is, niet double .

0
toegevoegd
er is geen methode in AsyncTask genaamd double onPostExecute (...) , het is void onPostExecute (...) . Wijzig uw retourtype in void .
toegevoegd de auteur Jason Robinson, de bron
Zoals Devunwired al zei, moet u ook uw parametertypen wijzigen.
toegevoegd de auteur Jason Robinson, de bron
Dus ik voeg @Override hier ook aan toe?
toegevoegd de auteur dustinrwh, de bron

Probeer de @Override te declareren

@Override
protected Object doInBackground(Object ... data) {...}
0
toegevoegd

Zowel onPostExecute() en onProgressUpdate() hebben de verkeerde handtekeningen, zodat ze niet worden gebeld omdat uw implementatie niet ten koste gaat van de basisimplementatie. Beide methoden moeten een Double -argument gebruiken, geen dubbele ... -arargs-array. Wijzig beide definities hiernaar

protected void onProgressUpdate(Double progress)

en dit

protected void onPostExecute(Double result)

Merk ook op dat de geretourneerde waarde van uw onPostExecute onjuist is (nietig maken zoals in het bovenstaande voorbeeld). En u hoeft super vanuit geen van beide methoden aan te roepen.

HTH!

0
toegevoegd