Döngü(loop) içində bir bir obyektin(object) methodunu çağırıram, amma bütün methodlar eyni vaxtda işə düşür.

Salam. Android-də (code-Java) bir proqram yazmaqdayam. Mətndəki cümlələri for-loop döngüsü tək-tək gəzirəm və həmin cümləni hazır bir obyektin methoduna parametr olaraq göndərirəm. Nəticədə, hər loop-iteratorda method işə düşür. Amma problem ondadır ki, bu methodlar hamısı eyni vaxtda işə düşmək istəyir. Çox güman ki, thread mechanizmi ilə işləyir. Və bir yerdən sonra `device is busy` logcat-da görünür. Bu methodların sinxronizə işə düşməyini yəni bir method işini qurtardıqdan sonra iterator.next-ə keçməyini necə həll etmək olar.


Yadda saxlama
Kateqoriya: Java, Proqramlaşdırma . , . Qısa keçid.

Verilmiş cavablar və yazılan şərhlər (6 cavab var)

(02:42, 18/03/2012 ) #10972

kodunuzun loop hissəsini bura yazsanız daha rahat olardı kömək etmək

Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(16:09, 18/03/2012 ) #10996

Bu kod istədiyim kimi işləmir hazırda, sadəcə indiki halı budur.

1public boolean playing=false;
2 private void prepareTTSEngine() {
3       try {
4           synthesis = SpeechSynthesis.getInstance(this);
5 
6 
7           synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {
8 
9               public void onPlaySuccessful() {
10                   Log.i(TAG, "onPlaySuccessful");
11                   playing=true;
12 
13               }
14 
15               public void onPlayStopped() {
16                   Log.i(TAG, "onPlayStopped");
17                   playing=false;
18 
19               }
20 
21               public void onPlayFailed(Exception e) {
22                   Log.e(TAG, "onPlayFailed");
23                   e.printStackTrace();
24                   playing=false;
25               }
26 
27               public void onPlayStart() {
28                   Log.i(TAG, "onPlayStart");
29                   //playing=true;
30 
31               }
32 
33               @Override
34               public void onPlayCanceled() {
35                   Log.i(TAG, "onPlayCanceled");
36                   playing=false;
37               }
38 
39 
40           });
41 
42  ]
43       } catch (InvalidApiKeyException e) {
44           Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
45           Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
46       }
47 
48   }
49 
50        prepareTTSEngine();
51       String speech= MapLocationOverlay.mSelectedMapLocation.getShortDesc();
52       synthesis.setVoiceType("usenglishfemale");
53 
54       BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
55       iterator.setText(speech);
56       int start = iterator.first();
57 
58       for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next()) {
59           if(speech !=null && speech.substring(start,end).compareTo("")!=0)
60           {
61               String sentence_next=speech.substring(start,end);                  
62                       //set ready flag to true (so isReady returns true)
63 
64 
65               while(playing==true)
66                   try {
67                       Thread.sleep(1000);
68                   } catch (InterruptedException e) {
69                       // TODO Auto-generated catch block
70                       e.printStackTrace();
71                   }
72                           try {
73                               synthesis.speak(sentence_next);
74                           } catch (BusyException e) {
75                               // TODO Auto-generated catch block
76                               e.printStackTrace();
77                           } catch (NoNetworkException e) {
78                               // TODO Auto-generated catch block
79                               e.printStackTrace();
80                           }
81 
82 
83 
84 
85           }
86       }
87   }
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(18:41, 18/03/2012 ) #11006

Ardıcıl olaraq səsləndirmək üçün Android Developer dakumentasiyasında TTS üçün ola bu məqalədəki “Making your application speak” hissəsinə baxın. Hər bir cümləni ayrı-ayrı səsləndirmək əvəzinə. Bir TTS obyektinə cümlələri növbə şəklində təqdim edə bilərsiniz. Bu nümunədə olduğu kimi:

1String myText1 = "Bu mövbənin ilk cümləsidir. ";
2String myText2 = "Bu isə ikinci növbəyə əlavə olunan ikinci cümlədir.";
3mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
4mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(19:33, 18/03/2012 ) #11009

Diqqətə görə çox sağ ol. Amma məndə TTS obyekti hazır bir kitabxana sinfinin obyektidir. Yəni Androidin öz TTS motorunu istifadə etmirəm. (Səbəb türk dili dəstəyinin olmaması.) Mənim tts obyektim org.ispeech.SpeechSynthesis class-ını istifadə edir. Dolayısı ilə speak methodu da tək parametr istəyir, əlavə parametrlər qəbul etmir. onplaysuccessful methodundan başa düşmək olar cümləni oxuyub qurtardığını (preparettsengine funksiyası içindəki). Yeganə yol ordan istifadə etmək kimi görünür.

Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(19:56, 18/03/2012 ) #11011

Koda üzdən baxdım. Aşağıdakı kodda niyə false yox true yazılıb?

1public void onPlaySuccessful() {
2    Log.i(TAG, "onPlaySuccessful");
3    playing=true;
4}
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(20:33, 18/03/2012 ) #11016

Flag dəyişkən olaraq istifadə edirdim onu, canPlay olacaqdı adı, amma işimə yaramadı, oxuyub qurtardığını, bir sonrakı cümləni oxuya bilərmi yoxlamaq üçün idi.

Problemi isə həll etdim 2 gün fikirləşdikdən sonra, bəlkə kiməsə lazım olar nə vaxtsa:

1static int counter=0;
2     
3    public List<String> sentences = new ArrayList<String>();
4     
5      private void prepareTTSEngine() {
6            try {
7                synthesis = SpeechSynthesis.getInstance(this);
8                 
9             
10                synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {
11 
12                    public void onPlaySuccessful() {
13                        Log.i(TAG, "onPlaySuccessful");
14                     
15                        try {
16                            if(counter!=sentences.size()-1)
17                            {
18                            synthesis.speak(sentences.get(counter));                       
19                            counter++;
20                            }
21                        } catch (BusyException e) {
22                            // TODO Auto-generated catch block
23                            e.printStackTrace();
24                        } catch (NoNetworkException e) {
25                            // TODO Auto-generated catch block
26                            e.printStackTrace();
27                        }
28                             
29                    }
30 
31                    public void onPlayStopped() {
32                        Log.i(TAG, "onPlayStopped");
33                        playing=false;
34                         
35                    }
36 
37                    public void onPlayFailed(Exception e) {
38                        Log.e(TAG, "onPlayFailed");
39                        e.printStackTrace();
40                        playing=false;
41                    }
42 
43                    public void onPlayStart() {
44                         
45                        Log.i(TAG, "onPlayStart");
46                        //playing=true;
47                         
48                    }
49 
50                    @Override
51                    public void onPlayCanceled() {
52                        Log.i(TAG, "onPlayCanceled");
53                        playing=false;
54                    }
55                     
56                     
57                });
58 
59                //synthesis.setVoiceType("usenglishfemale1"); // All the values available to you can be found in the developer portal under your account
60 
61            } catch (InvalidApiKeyException e) {
62                Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
63                Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
64            }
65 
66        }
67 
68             
69             
70             
71             
72            BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
73            iterator.setText(speech);
74            int start = iterator.first();
75             
76            for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next())
77            {
78                if(speech !=null && speech.substring(start,end).compareTo("")!=0)
79                {
80                    final String sentence_next=speech.substring(start,end);
81                     
82                    sentences.add(sentence_next);
83//                          //set ready flag to true (so isReady returns true)
84//     
85//                                  
86//                   
87//                                  try {
88//                                      synthesis.speak("first sentence");
89//                                     
90//                                  } catch (BusyException e) {
91//                                      // TODO Auto-generated catch block
92//                                      e.printStackTrace();
93//                                  } catch (NoNetworkException e) {
94//                                      // TODO Auto-generated catch block
95//                                      e.printStackTrace();
96//                                  }
97//                            
98//                       
99//                 
100//                         // break;
101                 }
102                             
103                 
104            }
105             
106            try {
107                counter=0;
108                synthesis.speak("The text");
109            } catch (BusyException e) {
110                // TODO Auto-generated catch block
111                e.printStackTrace();
112            } catch (NoNetworkException e) {
113                // TODO Auto-generated catch block
114                e.printStackTrace();
115            }
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

Bu suala aid öz sualım var:
Sual verin
Bu suala cavab vermək istəyirəm:
Cavab verin

Cavab verin


Cavab yazmaq üçün lütfən sağ sütundan və ya buradan hesaba daxil olun.

Üzvlər üçün giriş

Qeydiyyat

Elan qutusu

Son cavablar və şərhlər

E. Hacı cavab verdi - Elektron servis xidmətləri (11 gün əvvəl)

cavaninsan cavab verdi - Amerika səhmləri (20 gün əvvəl)

Software Developer cavab verdi - Amerika səhmləri (20 gün əvvəl)

SN cavab verdi - Kripto vergi (29 gün əvvəl)

Nicat97 cavab verdi - ilkaddimlar.com-a nə oldu? (36 gün əvvəl)

nicatmemmedli cavab verdi - Proqramlaşdırma - fəlsəfə (39 gün əvvəl)

nicatmemmedli cavab verdi - ilkaddimlar.com-a nə oldu? (39 gün əvvəl)

Software Developer cavab verdi - ilkaddimlar.com-a nə oldu? (50 gün əvvəl)

E. Hacı cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (59 gün əvvəl)

Triste cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (60 gün əvvəl)

E. Hacı cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (61 gün əvvəl)

Triste cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (61 gün əvvəl)

E. Hacı cavab verdi - Telefon almışam kamerasında ləkə var qaytarmaq istəyirəm, mağaza qaytarmır (61 gün əvvəl)

Software Developer cavab verdi - Rus dili yatırımı (61 gün əvvəl)

Cənab cavab verdi - Rus dili yatırımı (62 gün əvvəl)

Software Developer - 615 xal

E. Hacı - 608 xal

Onar Alili - 526 xal

Dilsuz - 448 xal

Cabbarov Sübhan - 434 xal

Maqa - 346 xal

Ruslan Butdayev - 328 xal

Namiq Bəndəli - 297 xal

U.Tarlan - 244 xal

Meherremoff - 234 xal

Sistemə daxil olmuş 23309 sualdan 92%-dən çoxu cavablandırılmışdır.

Proyekt haqqında

E-Haci.net istehsalı. © 2010-2025