Мое приложение работает, но экран черный и вылетает при попытке использовать пользовательский вид

Я работал над созданием простого гитарного тюнера для моего телефона. Я довольно новичок в разработке для Android и попытался понять процесс создания гитарного тюнера с помощью https://code.google.com/p/android-guitar-tuner/source/browse/, который очень помог.

Моя проблема заключалась в том, чтобы заставить экран отображаться вместо черного экрана во время работы проекта. В журнале я печатаю лучшие частоты и они распечатывают правильно. Я видел, что использование пользовательского View может помочь мне, но он падает каждый раз, когда я пытаюсь его использовать. У меня есть нарисованное изображение, которое я хотел бы использовать в качестве фона, и вместо использования setContentView(R.layout.activity_tuner) я хотел бы найти способ использовать мое настраиваемое представление Analyze для выполнения чего-то вроде setContentView(new Analyze(this)).

Вот основной вид деятельности, класс xml и пользовательский класс представления, с которым я работаю, я в основном спрашиваю руководство о том, с чего начать, чтобы решить мою проблему, или помощь в ресурсах о том, как я могу настроить пользовательский вид, используя нарисованное изображение, если это возможно

Я также понимаю, что в моем классе пользовательского представления ничего нет, я пробовал несколько вещей, используя растровые изображения, но безрезультатно. Я удалил код, который был там, и заменил setContentView (новый Analyze (этот)) на setContentView(R.layout.activity_tuner), чтобы я мог проверить частоты с помощью гитары в logcat.

activity_tuner.xml:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.example.thenxttuner"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/graybackgroundtunerpage"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Tuner" >
<com.example.thenxttuner.Analyze
    android:id="@+id/custView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    />
<ImageView
    android:id="@+id/display"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:src="@drawable/dashdrawable" />

<Button
    android:id="@+id/start"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/display"
    android:layout_below="@+id/display"
    android:layout_marginTop="21dp"
    android:background="@color/limegreen"
    android:text="Stop Tuning" />

</RelativeLayout> 

Tuner.java:

public class Tuner extends Activity{
boolean recording = true;
Button start;
Thread myThread;
TextView text, texttwo, textthree;
private double pitch;
Analyze back;
private static final String TAG = "Tuner";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tuner);
    start = (Button) findViewById(R.id.start);

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(recording==true){
                start.setText("Stop Tuning");
                recording=false;
                onStart();
            }else{
                start.setText("Start Tuning");
                recording=true;
                onStop();
            }
        }
    });
}

@Override
public void onStart(){
    super.onStart();
    //setContentView(R.layout.activity_tuner);
    //Log.v(TAG,  "in onStart()");

    myThread = new Thread(new Detector(this, new Handler()));
    myThread.run();
}

@Override
public void onStop(){
    super.onStop();
    //Log.v(TAG, "in onStop()");

    myThread.interrupt();
}


public void ShowResult(final HashMap<Double, Double> frequencies, final double best){
    Log.v(TAG,  "best = "+best);

    pitches[0][0] = 82.41;
    pitches[0][1] = 87.31;
    pitches[0][2] = 92.5;
    pitches[0][3] = 98;
    pitches[0][4] = 103.8;
    pitches[1][0] = 110;
    pitches[1][1] = 116.54;
    pitches[1][2] = 123.48;
    pitches[1][3] = 130.82;
    pitches[1][4] = 138.59;
    pitches[2][0] = 147.83;
    pitches[2][1] = 155.56;
    pitches[2][2] = 164.81;
    pitches[2][3] = 174.62;
    pitches[2][4] = 185;
    pitches[3][0] = 196;
    pitches[3][1] = 207;
    pitches[3][2] = 220;
    pitches[3][3] = 233.08;
    pitches[4][0] = 246.96;
    pitches[4][1] = 261.63;
    pitches[4][2] = 277.18;
    pitches[4][3] = 293.66;
    pitches[4][4] = 311.13;
    pitches[5][0] = 329.63;
    pitches[5][1] = 349.23;
    pitches[5][2] = 369.99;
    pitches[5][3] = 392;
    pitches[5][4] = 415.3;
    pitches[5][5] = 440;
}
double[][] pitches = new double[6][6];
}

Analyze.java:

public class Analyze extends View{
private static final String TAG = "Analyze";
private final static int UI_UPDATE = 100;
private Handler AnaHandler;
private Timer timer;

public Analyze(Context context) {
    // TODO Auto-generated constructor stub
    super(context);



    /**UI update
    AnaHandler = new Handler();
    timer = new Timer();

    timer.schedule(new TimerTask(){
        public void run(){
            AnaHandler.post(new Runnable(){
                public void run(){
                    invalidate();
                }
            });
        }
    }, 
    UI_UPDATE,
    UI_UPDATE);**/ 
    // not sure if needed 


}

@Override
public void onDraw(Canvas canvas){

}



}

1 ответ

Решение

Ваше приложение запущено в Uİ Thread, вы вызываете метод run потока... вы должны использовать start-method, в противном случае это просто обычный вызов метода.

Другие вопросы по тегам