Java 使用异步任务和重新启动方法

Java 使用异步任务和重新启动方法,java,android,android-asynctask,Java,Android,Android Asynctask,这是我的第一个项目,所以请原谅我的粗略代码,特别是对于if()这件事;)我稍后会设法解决它 1问题-当应用程序启动时,它的UI不会显示我在活动主布局中所做的操作。当结果发送到显示器时,我的UI会显示出来 我想我需要在某处添加异步任务。我试着举一些例子,但我做错了什么。也许有人可以帮我找到我需要的代码和位置,在应用程序启动后立即查看我的应用程序UI 2问题-第一个结果发送到屏幕后,如何在程序中重新启动录音任务? 目前,我正在打破while循环,以便能够将文本发送到屏幕。 若我试图从循环中设置文本,

这是我的第一个项目,所以请原谅我的粗略代码,特别是对于if()这件事;)我稍后会设法解决它

1问题-当应用程序启动时,它的UI不会显示我在活动主布局中所做的操作。当结果发送到显示器时,我的UI会显示出来

我想我需要在某处添加异步任务。我试着举一些例子,但我做错了什么。也许有人可以帮我找到我需要的代码和位置,在应用程序启动后立即查看我的应用程序UI

2问题-第一个结果发送到屏幕后,如何在程序中重新启动录音任务? 目前,我正在打破while循环,以便能够将文本发送到屏幕。 若我试图从循环中设置文本,在循环运行期间,什么也不会发生

提前谢谢

MainActivity.java代码:

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.ToggleButton;


public class MainActivity extends Activity {
private static final int RECORDER_SAMPLERATE = 8000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING =       AudioFormat.ENCODING_PCM_16BIT;

public AudioRecord recorder = null;
int numCrossing, p, numSamples;
short audioData[];
public int frequency;
public boolean recording;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String TAG = "tulemus";
    int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
            RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING,     bufferSize);

    recorder.startRecording();
    recording = true;
    audioData = new short[bufferSize];
    int[] values;
    int k = 0, t = 0;

    values = new int[2];

    while (recording) {
        numCrossing = 0;
        numSamples = 0;
        recorder.read(audioData, 0, bufferSize);
        int mod = (bufferSize / 4) * 4;

        for (p = 0; p < mod; p += 4) {
            if (audioData[p] > 0 && audioData[p + 1] <= 0) numCrossing++;
            if (audioData[p] < 0 && audioData[p + 1] >= 0) numCrossing++;
            if (audioData[p + 1] > 0 && audioData[p + 2] <= 0) numCrossing++;
            if (audioData[p + 1] < 0 && audioData[p + 2] >= 0) numCrossing++;
            if (audioData[p + 2] > 0 && audioData[p + 3] <= 0) numCrossing++;
            if (audioData[p + 2] < 0 && audioData[p + 3] >= 0) numCrossing++;
            if (audioData[p + 3] > 0 && audioData[p + 4] <= 0) numCrossing++;
            if (audioData[p + 3] < 0 && audioData[p + 4] >= 0) numCrossing++;
            numSamples += 4;
        }
        for (p = 0; p < bufferSize; p++) {
            if (audioData[p] > 0 && audioData[p + 1] <= 0) numCrossing++;
            if (audioData[p] < 0 && audioData[p + 1] >= 0) numCrossing++;
            numSamples++;
        }

        frequency = (8000 / numSamples) * numCrossing;

        Log.d(TAG, String.valueOf(frequency));

        if (frequency >= 2550 && frequency <= 2750 && (values[0] != 2)) {
            values[0] = 1;
            values[1] = 2;
            k = 1;
        }//if

        if (frequency <= 3090 && frequency >= 2900 && (values[0] == 0)) {
            values[0] = 2;
            values[1] = 1;
            k = 1;
        }//if

        if (frequency <= 3090 && frequency >= 2900 && (values[0] == 1)) {
            t = 1;
            break;
        }//if

        if (frequency >= 2550 && frequency <= 2750 && (values[0] == 2)) {
            t = 2;
            break;
        }//if

        if (k != 0) {
            k = k + 1;
        }//if

        if (k == 20) {
            values[0] = 0;
            values[1] = 0;
        }//if

    }//while

    if (t == 1) {
        TextView textView = (TextView) findViewById(R.id.textView);
        String next = "<font color='#FF0000'>&#8679</font>";
        textView.setText(Html.fromHtml(next));
        values[0] = 0;
        values[1] = 0;
    }//if

    if (t == 2) {
        TextView textView = (TextView) findViewById(R.id.textView);
        String next = "<font color='#FFFF00'>&#8681</font>";
        textView.setText(Html.fromHtml(next));
        values[0] = 0;
        values[1] = 0;
    }//if

}//onCreate

public void onToggleClicked(View view) {
    // Is the toggle on?
    boolean on = ((ToggleButton) view).isChecked();

    if (on) {

    } else {
        System.exit(0);
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:clickable="false"
android:id="@+id/RelLayout"
android:focusable="false"
android:visibility="visible"
android:background="#ff000000">

<TextView
    android:layout_width="200dp"
    android:layout_height="1000dp"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:id="@+id/textView"
    android:layout_alignParentTop="true"
    android:textSize="50sp" />

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/switch1"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:checked="true"
    android:onClick="onToggleClicked"/>
导入android.app.Activity;
导入android.media.AudioFormat;
导入android.media.AudioRecord;
导入android.media.MediaRecorder;
导入android.os.Bundle;
导入android.text.Html;
导入android.util.Log;
导入android.view.view;
导入android.widget.TextView;
导入android.widget.ToggleButton;
公共类MainActivity扩展了活动{
专用静态最终积分记录仪\u采样器=8000;
专用静态最终整数记录器\u通道=单声道中的AudioFormat.CHANNEL\u;
专用静态最终整数记录器\u音频\u编码=AudioFormat.ENCODING\u PCM\u 16位;
公共录音机=空;
int numCrossing,p,numSamples;
短音频数据[];
公共int频率;
公共录音;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String TAG=“tulemus”;
int bufferSize=AudioRecord.getMinBufferSize(记录器\u采样器,
录像机信道、录像机音频编码);
录音机=新的录音机(MediaRecorder.AudioSource.MIC,
录像机采样器、录像机通道、录像机音频编码、缓冲区大小);
记录器。开始记录();
记录=真;
audioData=新的短[缓冲区大小];
int[]值;
int k=0,t=0;
数值=新整数[2];
同时(录音){
numCrossing=0;
numSamples=0;
记录器。读取(音频数据,0,缓冲区大小);
int mod=(bufferSize/4)*4;
对于(p=0;p0&&audioData[p+1]=0)numCrossing++;
如果(音频数据[p+1]>0和音频数据[p+2]=0)numCrossing++;
如果(音频数据[p+2]>0和音频数据[p+3]=0)numCrossing++;
如果(音频数据[p+3]>0和音频数据[p+4]=0)numCrossing++;
numSamples+=4;
}
对于(p=0;p0&&audioData[p+1]=0)numCrossing++;
numSamples++;
}
频率=(8000个/numSamples)*numCrossing;
Log.d(标签、字符串、valueOf(频率));
如果(frequency>=2550&&frequency=2550&&frequency您的活动(和您的应用程序)在onCreate()返回之前不会显示,这就是您没有看到任何内容的原因。您肯定应该从该函数中删除录制,选项包括将其移动到asyncTask、服务或使用Runnable简单地移动到另一个线程

AsyncTask可能是最好的选择,它也将帮助您回答第二个问题。只需在任务中不断记录,将结果发送到活动并在屏幕上绘制即可


请记住,在android中,主线程应该只处理与视觉相关的任务,所有工作都应该转移到另一个线程。android提供了几个选项来帮助您实现这一点(如asyncTask)

谢谢您的重播。我试图自己解决这个异步任务,但目前它对我来说太复杂了。据我所知,我只能使用doInBackground执行任务,而使用UpdateProgress在后台运行时在循环期间获取结果?我可以返回这两个字符串“next”吗在onProgressUpdate()中使用publishProgress()和setText显示它们?好的,今天我比昨天聪明了一点;)看来我需要使用服务,因为我需要长时间(小时)运行后台任务AsynkTask并非如此,操作系统可以很容易地终止AsynkTask。是的,如果您的意思是运行数小时,则服务更合适。请记住,如果用户锁定手机,服务也可以终止或暂停,如果您想避免这种行为,则应使用前台服务(您在通知栏中看到的那些服务)如果我的回答有帮助,请提高投票率和/或提高投票率。我不能投票,因为我的声誉目前低于15(