Мое приложение работает, но экран черный и вылетает при попытке использовать пользовательский вид
Я работал над созданием простого гитарного тюнера для моего телефона. Я довольно новичок в разработке для 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, в противном случае это просто обычный вызов метода.