java - 摩尔斯电码应用程序 AsyncTask 错误 5

标签 java android android-asynctask

制作一个应用程序,它采用 EditText 值并将其转换为摩尔斯电码并输出音频,同时更改 TextView 背景颜色以执行任务。音频和 TextView 改变颜色是一起完成的。
我正在使用这个类 MorseTask.java 我相信它给我带来了最多的问题:

public class MorseTask extends AsyncTask<String, Integer, Void> {
private String translate;

@Override
protected Void doInBackground(String... params) {

    translate = params[0];
    int hold = 500;
    LinkedList<Signal> signals = MorseCode.genOnOffSchedule(translate, hold);
    long start = System.currentTimeMillis();

    while (!signals.isEmpty()){
        Signal sig = signals.removeFirst();
        boolean landed = false;
        while(!landed){
            landed = (System.currentTimeMillis() - start) > sig.getOnset();
            flashUI(sig);
        }
    }
    return null;
}
//TODO this
public void flashUI(Signal signal){
    int flashColor = Color.rgb(255, 255, 255);
    int oldColor = Color.rgb(2, 2, 2);
    if(signal.isOn()){
        publishProgress(1);
        MainActivity.textView2.setBackgroundColor(flashColor);
        int toneHrzt = 440;
        AudioTrack sound = AudioUtils.generateTone(toneHrzt, signal.getDuration());
        sound.play();
        //TODO this may need not null I'm not sure
        if(sound == null){
            sound.release();
        }
    }
    else{
        publishProgress(0);
        MainActivity.textView2.setBackgroundColor(oldColor);

    }
    try {
        Thread.sleep(signal.getDuration());
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }

}
//TODO add something here probably a void param
protected void onPostExecute(TextView result){
    //TODO reset the activity, possibly


}
}  
  • MorseCode.genOnOffSchedule(String, int) 是一种基本上设置 MorseCode 的序列/模式的方法。

  • 除了重置 Activity 之外,我不知道如何使用onPostExecute

这是我的 MainActivity 以及我如何执行任务:

public class MainActivity extends AppCompatActivity {
public static TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView2 = (TextView)findViewById(R.id.textView2);
    final EditText message = (EditText)findViewById(R.id.editText);
    final Button translate = (Button)findViewById(R.id.button);
    translate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String text = message.getText().toString();
            MorseTask transmit = new MorseTask();
            transmit.execute(text);
        }
    });
}

}

最后是我的 logcat 错误:

04-11 19:45:45.191 7815-7937/MYDOMAIN E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #5
Process: MYDOMAIN, PID: 7815
                                                      java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                          at android.os.AsyncTask$3.done(AsyncTask.java:304)
                                                                          at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                          at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                          at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                          at java.lang.Thread.run(Thread.java:818)
                                                                       Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                                                                          at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
                                                                          at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)
                                                                          at android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)
                                                                          at android.view.View.invalidateInternal(View.java:11801)
                                                                          at android.view.View.invalidate(View.java:11737)
                                                                          at android.view.View.invalidateDrawable(View.java:15825)
                                                                          at android.widget.TextView.invalidateDrawable(TextView.java:5129)
                                                                          at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:368)
                                                                          at android.graphics.drawable.ColorDrawable.setColor(ColorDrawable.java:134)
                                                                          at android.view.View.setBackgroundColor(View.java:16184)
                                                                          at edu.ggc.amauldin.morsecode.MorseTask.flashUI(MorseTask.java:45)
                                                                          at edu.ggc.amauldin.morsecode.MorseTask.doInBackground(MorseTask.java:34)
                                                                          at edu.ggc.amauldin.morsecode.MorseTask.doInBackground(MorseTask.java:18)
                                                                          at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                          at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                          at java.lang.Thread.run(Thread.java:818) 

最佳答案

这些行:

MainActivity.textView2.setBackgroundColor(flashColor);
...
MainActivity.textView2.setBackgroundColor(oldColor);

flashUI() 方法中调用,您从 doInBackground() 调用该方法,这意味着它们发生在单独的线程上。除了主线程之外,您无法从任何线程触摸屏幕上的View

将这些行移至 AsyncTaskonProgressUpdate() 方法,该方法在主线程上运行。

关于java - 摩尔斯电码应用程序 AsyncTask 错误 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36561570/

相关文章:

java - Android问题用opengl es绘制位图

安卓 : Make 2 services communicate

android - Android 中 AsyncTask 的 OutOfMemory

Java修剪(): Cleanest way to check null string before trimming?

java.sql.SQLException : The url cannot be null

java - 获取 xs :choice maxOccurs and minOccurs attributes with XSOM

android - 如何强制仅在我的应用程序中使用 zxing lib?

java - 克隆是否提供了优于构造函数/工厂方法的性能改进?

java - 为什么下载管理器完成后广播接收器不调用?

java - 如何无限循环异步任务?