| | |
| Stránka: 1 z 1
| [ Príspevkov: 4 ] | |
Autor | Správa |
---|
Registrovaný: 01.03.13 Prihlásený: 27.03.24 Príspevky: 219 Témy: 49 Bydlisko: Sabinov | Napísal buci: 09.07.2015 16:26 | |
|
Zdravím, nevedel by mi niekto poradiť s mojim problémom? Neviem aký parameter má byť v tom Context pri metóde MediaPlayer.create(Context, Uri). Ten MediaPlayer používam v jednej non-activity triede (MyCountDownTimer.class) a to je podľa mňa môj problém. Keď som najprv spravil normálne MainActivity.class a v nej vnorenú druhú triedu (MyCountDownTimer.class), tak som namiesto Context mohol písať getApplicationContext() a fungovalo to. Ale ak vytvorím samostatnú triedu, tak už getApplicationContext() nemôžem napísať a nejde mi to ani ak pošlem z prvej triedy Context ako parameter konštruktora do druhej triedy. Nevie niekto ako na to? prípadne aj nejaké dobré české/slovenské vysvetlenie Contextu? Vďaka tu sú časti zdrojákov: Kód: public class MainActivity extends ActionBarActivity {
public TextView textviewTimer1; private TextView textviewTimer2; private MyCountDownTimer casovac1; private MyCountDownTimer casovac2; private int startTime = 10000; public static final String FORMAT = "%02d:%02d";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
textviewTimer1 = (TextView) findViewById(R.id.textViewTimer1); textviewTimer2 = (TextView) findViewById(R.id.textViewTimer2);
textviewTimer1.setText("" + String.format(FORMAT, startTime/1000 / 60, ((startTime/1000) % 60))); textviewTimer2.setText("" + String.format(FORMAT, startTime/1000 / 60, ((startTime/1000) % 60)));
casovac1 = new MyCountDownTimer(this, textviewTimer1, startTime, 200); //CHYBA TU (42. riadok) casovac2 = new MyCountDownTimer(this, textviewTimer2, startTime, 200);
} Kód: public class MyCountDownTimer extends CountDownTimer {
private Context context;
TextView textviewTimer;
public MyCountDownTimer(Context mContext, TextView textView, long startTime, long interval) { super(startTime, interval); context = mContext; textviewTimer = textView; }
MediaPlayer mp3 = MediaPlayer.create(context, R.raw.three); //CHYBA TU (28. riadok) MediaPlayer mp2 = MediaPlayer.create(context, R.raw.two); MediaPlayer mp1 = MediaPlayer.create(context, R.raw.one); MediaPlayer mpHorn = MediaPlayer.create(context, R.raw.airhorn);
... a chybová hláška: Kód: 07-08 22:17:08.259 22889-22889/? E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.martin.odpocitavaniepokus1/com.martin.odpocitavaniepokus1.MainActivity}: java.lang.NullPointerException ... Caused by: java.lang.NullPointerException at android.media.MediaPlayer.create(MediaPlayer.java:677) at com.martin.odpocitavaniepokus1.MyCountDownTimer.(MyCountDownTimer.java:28) at com.martin.odpocitavaniepokus1.MainActivity.onCreate(MainActivity.java:42)
|
|
Registrovaný: 05.04.11 Príspevky: 1693 Témy: 50 Bydlisko: Žilina, Pop... | Napísal XOLOO: 09.07.2015 18:33 | |
|
Treba pouzivat Android dokumentaciu. http://developer.android.com/reference/android/content/Context.html Context je vlastne nieco co ti dovoluje pristup ku platformovo specifickym veciam, ako resources kde mas fonty, obrazky, stringy atd., ako ja spustanie novych aktivit a rozne ine veci. Keby si si precital dokumentaciu tak by si videl ze potomkom triedy Context je ContextWrapper a medzi jeho potomkami je aj Activity trieda. Z toho je jasne ze Activita je vlastne sama sebou Context-om a preto v inej trieda, ktora nema napisane extends AppCompatActivity (ActionBarActivity je deprecated a nemal by si to pouzivat), teda nie je potomkom Contextu, tak sa tam ten Context nema ako objavit a musis ho posielat cez parametre konstruktora. Tu sa dostavame k nejakym problemom a to ze Context moze zaniknut a mal by si pouzivat WeakReference<Context> http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html Dalej neviem co chces docielit podedenim CountDownTimer triedy ale posielat do triedy context, ktora by nic s contextom nemala mat spolocne je dost zly pristup. Ten error je nejaky divny skus si tam dat if podmienky nech to logne ci context, alebo textview je null a posli tu celu triedu
_________________ rMBP 13 2015 iPhone 7
|
|
Registrovaný: 01.03.13 Prihlásený: 27.03.24 Príspevky: 219 Témy: 49 Bydlisko: Sabinov | Napísal autor témy buci: 09.07.2015 22:42 | |
|
no ten nápad s contextom som si vygooglil na stack overflow, ale zrejme to nebol presne môj prípad tu posielam obe triedy: MainActivity.class Kód: public class MainActivity extends ActionBarActivity {
public TextView textviewTimer1; private TextView textviewTimer2; private MyCountDownTimer casovac1; private MyCountDownTimer casovac2; private int startTime = 10000; public static final String FORMAT = "%02d:%02d";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
textviewTimer1 = (TextView) findViewById(R.id.textViewTimer1); textviewTimer2 = (TextView) findViewById(R.id.textViewTimer2);
textviewTimer1.setText("" + String.format(FORMAT, startTime/1000 / 60, ((startTime/1000) % 60))); textviewTimer2.setText("" + String.format(FORMAT, startTime/1000 / 60, ((startTime/1000) % 60)));
casovac1 = new MyCountDownTimer(this, textviewTimer1, startTime, 200); casovac2 = new MyCountDownTimer(this, textviewTimer2, startTime, 200);
}
public void StartTimer1(View view) { casovac1.start(); }
public void StopTimer1(View view) { casovac1.cancel(); }
public void StartTimer2(View view) { casovac2.start(); }
public void StopTimer2(View view) { casovac2.cancel(); }
} MyCountDownTimer.class Kód: public class MyCountDownTimer extends CountDownTimer {
boolean played1 = false; boolean played2 = false; boolean played3 = false;
int sekundy; private Context context;
TextView textviewTimer;
public MyCountDownTimer(Context mContext, TextView textView, long startTime, long interval) { super(startTime, interval); context = mContext; textviewTimer = textView; }
MediaPlayer mp3 = MediaPlayer.create(context, R.raw.three); MediaPlayer mp2 = MediaPlayer.create(context, R.raw.two); MediaPlayer mp1 = MediaPlayer.create(context, R.raw.one); MediaPlayer mpHorn = MediaPlayer.create(context, R.raw.airhorn);
@Override public void onTick(long millisUntilFinished) { sekundy = (int) Math.ceil(millisUntilFinished / 1000.0); textviewTimer.setText("" + String.format(MainActivity.FORMAT, sekundy / 60, (sekundy % 60)));
if (sekundy == 3 && played3 == false) { mp3.start(); played3 = true; } if (sekundy == 2 && played2 == false) { mp2.start(); played2 = true; } if (sekundy == 1 && played1 == false) { mp1.start(); played1 = true; } }
@Override public void onFinish() { textviewTimer.setText("00:00"); mpHorn.start(); } }
|
|
Registrovaný: 05.04.11 Príspevky: 1693 Témy: 50 Bydlisko: Žilina, Pop... | Napísal XOLOO: 13.07.2015 0:18 | |
|
A tebe sa to vobec neda spustit, alebo to padne az po stlaceni tlacidla ? Kazdopadne skopiruj cely log a daj ho tu ako spoiler. Este ma napadlo, vsade kde volas Kód: mpX.start(); skus najprv zavolat Kód: if(mpX != null) mpX.start(); Inak ti to pada na nejakom divnom riadku. Aky mas typ zvukov ? Inak nedefinuj onclick metody v xml atributoch, pouzivaj anonymne bloky, alebo skus nieco taketo http://jakewharton.github.io/butterknife/
_________________ rMBP 13 2015 iPhone 7
|
|
| Stránka: 1 z 1
| [ Príspevkov: 4 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|