मैंने एंड्रॉइड में एक साधारण म्यूजिक प्लेयर बनाया है। प्रत्येक गीत के दृश्य में एक सीकबार होता है, जिसे इस तरह से कार्यान्वित किया जाता है:
public class Song extends Activity implements OnClickListener,Runnable {
private SeekBar progress;
private MediaPlayer mp;
// ...
private ServiceConnection onService = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder rawBinder) {
appService = ((MPService.LocalBinder)rawBinder).getService(); // service that handles the MediaPlayer
progress.setVisibility(SeekBar.VISIBLE);
progress.setProgress(0);
mp = appService.getMP();
appService.playSong(title);
progress.setMax(mp.getDuration());
new Thread(Song.this).start();
}
public void onServiceDisconnected(ComponentName classname) {
appService = null;
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song);
// ...
progress = (SeekBar) findViewById(R.id.progress);
// ...
}
public void run() {
int pos = 0;
int total = mp.getDuration();
while (mp != null && pos<total) {
try {
Thread.sleep(1000);
pos = appService.getSongPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
progress.setProgress(pos);
}
}
यह ठीक काम करता है। अब मुझे गाने की प्रगति के कुछ सेकंड / मिनट गिनने के लिए एक टाइमर चाहिए। इसलिए मैंने TextView
लेआउट में एक डाला , इसे findViewById()
अंदर ले आया onCreate()
, और इसे run()
बाद में डाला progress.setProgress(pos)
:
String time = String.format("%d:%d",
TimeUnit.MILLISECONDS.toMinutes(pos),
TimeUnit.MILLISECONDS.toSeconds(pos),
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(
pos))
);
currentTime.setText(time); // currentTime = (TextView) findViewById(R.id.current_time);
लेकिन वह आखिरी पंक्ति मुझे अपवाद देती है:
android.view.ViewRoot $ CalledFromWrongThreadException: केवल मूल धागा जिसने दृश्य पदानुक्रम बनाया है, वह अपने विचारों को छू सकता है।
फिर भी मैं मूल रूप से वही काम कर रहा हूं जैसा कि मैं कर रहा हूं SeekBar
- में दृश्य बनाना onCreate
, फिर उसमें स्पर्श करना run()
- और यह मुझे यह शिकायत नहीं देता है।
error.setText(res.toString());
रन () विधि के अंदर करना चाहता था , लेकिन मैं रेस का उपयोग नहीं कर सकता था क्योंकि यह अंतिम नहीं था .. बहुत बुरा