i'm writing an android program for visualizing the audio signal. The main activity is:
package com.example.soundvisualizer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private CDrawer.CDrawThread mDrawThread;
private CDrawer mdrawer;
private Button btn;
private View.OnClickListener listener;
private Boolean m_bStart;
private Boolean recording;
private CSampler sampler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
m_bStart = false;
mdrawer = (CDrawer) findViewById(R.id.drawer);
while (true){
recording = false;
run();
return;
}
}
/**
* Pause the visualizer when the app is paused
*/
@Override
protected void onPause(){
System.out.println("onPause");
sampler.SetRun(false);
mDrawThread.setRun(false);
sampler.SetSleeping(true);
mDrawThread.SetSleeping(true);
super.onPause();
}
/**
* Resters the visualizer when the app restarts
*/
@Override
protected void onRestart(){
m_bStart = true;
System.out.println("onRestart");
super.onRestart();
}
/**
* Resume the visualizer when the app resumes
*/
@Override
protected void onResume(){
System.out.println("onResume");
int i = 0;
while (true){
if ((sampler.GetDead2()) && (mdrawer.GetDead2())){
System.out.println(sampler.GetDead2() + ", " + mdrawer.GetDead2());
sampler.Restart();
if (!m_bStart.booleanValue())
mdrawer.Restart(true);
sampler.SetSleeping(false);
mDrawThread.SetSleeping(false);
m_bStart = false;
super.onResume();
return;
}
try{
Thread.sleep(500L);
System.out.println("Hang on..");
i++;
if (!sampler.GetDead2().booleanValue())
System.out.println("sampler not DEAD!!!");
if (!mdrawer.GetDead2().booleanValue()){
System.out.println("mDrawer not DeAD!!");
mdrawer.SetRun(false);
}
if (i <= 4)
continue;
mDrawThread.SetDead2(true);
}
catch (InterruptedException localInterruptedException){
localInterruptedException.printStackTrace();
}
}
}
@Override
protected void onStart(){
System.out.println("onStart");
super.onStart();
}
@Override
protected void onStop(){
System.out.println("onStop");
super.onStop();
}
/**
* Recives the buffert from the sampler
* @param buffert
*/
public void setBuffer(short[] paramArrayOfShort){
mDrawThread = mdrawer.getThread();
mDrawThread.setBuffer(paramArrayOfShort);
}
/**
* Called by OnCreate to get everything up and running
*/
public void run(){
try {
if (mDrawThread == null){
mDrawThread = mdrawer.getThread();
}
if (sampler == null)
sampler = new CSampler(this);
Context localContext = getApplicationContext();
Display localDisplay = getWindowManager().getDefaultDisplay();
Toast localToast = Toast.makeText(localContext, "Please make some noise..", Toast.LENGTH_LONG);
localToast.show();
if (sampler != null){
try {
sampler.Init();
}
catch (Exception e) {
Toast.makeText(this,"Could not instance the sampler. Could not access the device audio-drivers", Toast.LENGTH_LONG).show();
}
btn = (Button) this.findViewById(R.id.button_stop);
btn.setOnClickListener(this);
sampler.StartRecording();
sampler.StartSampling();
}
}
catch (NullPointerException e) {
Log.e("Main_Run", "NullPointer: " + e.getMessage());
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(btn.getText().equals("Start")){
btn.setText("Stop");
sampler.StartRecording();
sampler.StartSampling();
}
else{
btn.setText("Start");
sampler.StopRecording();
}
}
}
Now, the app starts and works fine. i click the stop button and it is ok. reclick start and the restart works fine. when I click Stop again the app crashes and the logcat displays the following lines reguarding my app:
I/ActivityManager( 755): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.soundvisualizer/.MainActivity} from pid 1054
I/ActivityManager( 755): Start proc com.example.soundvisualizer for activity com.example.soundvisualizer/.MainActivity: pid=6959 uid=10126 gids={50126}
I/ActivityManager( 755): Displayed com.example.soundvisualizer/.MainActivity: +710ms
W/ActivityManager( 755): Force finishing activity com.example.soundvisualizer/.MainActivity
W/ActivityManager( 755): Exception thrown during pause
W/ActivityManager( 755): android.os.DeadObjectException
W/ActivityManager( 755): at android.os.BinderProxy.transact(Native Method)
W/ActivityManager( 755): at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:660)
W/ActivityManager( 755): at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:761)
W/ActivityManager( 755): at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2455)
W/ActivityManager( 755): at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2329)
W/ActivityManager( 755): at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2035)
W/ActivityManager( 755): at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:9543)
W/ActivityManager( 755): at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:9436)
W/ActivityManager( 755): at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:10081)
W/ActivityManager( 755): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:9632)
W/ActivityManager( 755): at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
I/ActivityManager( 755): Config changes=480 {1.0 222mcc10mnc it_IT ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.583}
I/ActivityManager( 755): Process com.example.soundvisualizer (pid 6959) has died.
W/ActivityManager( 755): No content provider found for permission revoke: file:///data/local/tmp/SoundVisualizer.apk
W/ActivityManager( 755): No content provider found for permission revoke: file:///data/local/tmp/SoundVisualizer.apk
I/ActivityManager( 755): Force stopping com.example.soundvisualizer appid=10126 user=-1: uninstall pkg
I/ActivityManager( 755): Force stopping com.example.soundvisualizer appid=10126 user=-1: update pkg
I/ActivityManager( 755): Force stopping com.example.soundvisualizer appid=10126 user=0: pkg removed
I have no idea about what causes the error and how can I fix it. Can anyone help me? Thanks in advance.
Edit I found this link in which is explained what type of error sigabrt is. the table says that sigabrt can be disabled by using -Xrs. How can I use -Xrs in Eclipse IDE??
That happens to me in this case:
The View can be null in some instant!!!
in your case put this each time that you access to that view:
if(mdrawer!=null){
//DO Whatever
}else{
Log.e(TAG,"ANDROID BUG");
}
EDIT: I have realized that it wasn't because the function called very fast. It was because I have a Listener and I didn't unregister when OnDestroy(). And When OnCreate, I had two listener. One with NULL result and the other one OK.
@Override
public void onDestroy() {
super.onDestroy();
if (mSensorManager!=null){mSensorManager.unregisterListener(listener);}
}