制作一个应用程序,它采用 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
。
将这些行移至 AsyncTask
的 onProgressUpdate()
方法,该方法在主线程上运行。
关于java - 摩尔斯电码应用程序 AsyncTask 错误 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36561570/