0

Spotify サーバーでアーティストと曲を検索する次のコードがあります。オートコンプリート テキストがありますが、「David Guetta」などの何かを検索し、1 文字を削除するたびにバックスペース ( <-- ) で削除しようとすると、検索が行われ、非常に高速に実行すると問題が発生します。アプリがクラッシュします (使用量が多いですか?)。それがその質問のためかどうかはわかりません。

これを修正するにはどうすればよいですか? 検索の待ち時間で修正できますが、その方法がわかりません。

これで私を助けてもらえますか?ありがとうございました。

これは私の SearchMusic.java コードです。

public class SearchMusic extends Activity {

    AutoCompleteTextView autoCompleteSongs;
    String searchTerms;
    String[] arrayArtist = new String[64];
    String[] arrayTrack = new String[64];
    ArrayAdapter<String> adapter;
    List<String> songs;
    List<String> lArtist;
    List<String> lTrack;

    boolean bothsearchs = false; // Controlamos que haya busqueda por artista y
                                    // pista si uno no existe.

    int nArtist = 0; // iterator

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_music);

        autoCompleteSongs = (AutoCompleteTextView) findViewById(R.id.autoCompletePetition);
        final ArrayAdapter<String> list = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line);

        // autoCompleteSongs.setThreshold(1);
        // autoCompleteSongs.addTextChangedListener(this);
        // autoCompleteSongs.setAdapter(new
        // ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,
        // item));

        autoCompleteSongs.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                if (s.length() > 3) {
                    searchTerms = s.toString();
                    searchTerms = searchTerms.replace(" ", "+");
                    // Buscamos por artista
                    AsyncHttpClient client = new AsyncHttpClient();
                    client.get("http://ws.spotify.com/search/1/artist.json?q="
                            + searchTerms + "*", null,
                            new JsonHttpResponseHandler() {
                                public void onSuccess(JSONObject data) {
                                    try {
                                        // Hay artistas con ese nombre
                                        if (data.length() > 0) {
                                            JSONArray artist = new JSONArray(
                                                    data.getJSONArray("artists")
                                                            .toString());

                                            for (int i = 0; i < 6; i++) {

                                                JSONObject orden = artist
                                                        .getJSONObject(i);
                                                String name = orden
                                                        .getString("name");
                                                list.add(name);
                                                arrayArtist[i] = name;
                                                arrayTrack[i] = "";
                                                nArtist++;
                                            }
                                        } else {
                                            bothsearchs = true;
                                        }
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }

                                }

                                @Override
                                public void onFailure(Throwable arg0) {

                                }
                            });

                    // Buscamos por pista
                    client.get("http://ws.spotify.com/search/1/track.json?q="
                            + searchTerms + "*", null,
                            new JsonHttpResponseHandler() {
                                public void onSuccess(JSONObject spoty) {
                                    try {
                                        JSONArray artist = new JSONArray(spoty
                                                .getJSONArray("tracks")
                                                .toString());

                                        for (int i = nArtist; i < nArtist + 6 ; i++) {
                                            JSONObject orden = artist
                                                    .getJSONObject(i);
                                            String name = orden
                                                    .getString("name");
                                            JSONArray nameArtist = new JSONArray(
                                                    orden.getJSONArray(
                                                            "artists")
                                                            .toString());
                                            JSONObject namArt = nameArtist
                                                    .getJSONObject(0);
                                            String nameArt = namArt
                                                    .getString("name");

                                            list.add("[" + nameArt + "] "
                                                    + name);
                                            arrayArtist[i] = nameArt;
                                            arrayTrack[i] = name;
                                        }

                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }

                                @Override
                                public void onFailure(Throwable arg0) {
                                }

                            });

                    list.notifyDataSetChanged();
                    TextView text = (TextView) findViewById(R.id.petitionTextView);

                    for(int i = 0; i < 12; i++){
                        Log.i("AART", "" + arrayArtist[i]);
                        Log.i("ATRA", "" + arrayTrack[i]);
                        }

                    if(arrayArtist[0] == null && arrayTrack[0] == ""){
                        text.setText("No hay resultados");
                    }else{

                        for(int i = 0; i < 12; i++){
                            String register = "<font color=#64c7eb>" + arrayArtist[i] + "</font> <font color=#272527>" + arrayTrack[i] + "</font></br>";
                            text.setText(Html.fromHtml(register));
                        }
                    }
                }
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            public void afterTextChanged(Editable s) {
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.search_music, menu);
        return true;
    }

}

私が正しければ、これが必要なコードです。問題はそれをどう止めるかです。¬¬

//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
        //Called each time when 1000 milliseconds (1 second) (the period parameter)
    }

},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
1000);
4

3 に答える 3

0

アドレスのリストを取得するために GooglePlaceApi を使用していたときに、同じ問題が発生しました。performFiltering()、publishResults()、および残りの呼び出しを行うメソッドで同期を使用しました。それは私のために働いた。多分あなたは試してみることができます。

 synchronized (input)
  {
   // Do something inside
  }
于 2013-11-13T15:51:09.837 に答える
0

できる最善の方法は、ハンドラーを使用することです。これは、ボタンを使用した簡単な例です。ただし、ボタンはコードのバックスペースを表します。

アイデアは 500 ミリ秒以内に検索アクションをスケジュールすることですが、誰かが再び検索ボタンを押すと、ユーザーが検索ボタンを押すのをやめるまで検索アクションを再スケジュールします。

幸運を!

   public class MyActivity extends Activity implements OnClickListener
    {
        protected static final int MSG_SEARCH = 0;

        protected Button buttonSearch;

        protected Handler handler = new Handler()
        {
            public void handleMessage(android.os.Message msg)
            {
                switch (msg.what)
                {
                    case MSG_SEARCH:

                        MyActivity.this.search();
                        break;
                }
            }
        };

        @Override
        public void onClick(View inView)
        {
            if (inView == this.buttonSearch)
            {
                this.handler.removeMessages(MSG_SEARCH);
                final Message message = Message.obtain(this.handler, MSG_SEARCH);
                this.handler.sendMessageDelayed(message, 500);
            }
        }

        protected void search()
        {
            // your seach code
        }
    }
于 2013-06-04T08:31:34.770 に答える
0

あなたはすでに良い解決策を示していると思います。http 要求を TimerTask 内にラップして、TimerTask をキャンセルするタイマー メカニズムを作成してみてください。

例 (テストされていません):

public class SearchMusic extends Activity {

    AutoCompleteTextView autoCompleteSongs;
    String searchTerms;
    String[] arrayArtist = new String[64];
    String[] arrayTrack = new String[64];
    ArrayAdapter<String> adapter;
    List<String> songs;
    List<String> lArtist;
    List<String> lTrack;
    //Declare and initialize the timer
    Timer t = new Timer();

    boolean bothsearchs = false; // Controlamos que haya busqueda por artista y
                                    // pista si uno no existe.

    int nArtist = 0; // iterator

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_music);

        autoCompleteSongs = (AutoCompleteTextView) findViewById(R.id.autoCompletePetition);
        final ArrayAdapter<String> list = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line);

        // autoCompleteSongs.setThreshold(1);
        // autoCompleteSongs.addTextChangedListener(this);
        // autoCompleteSongs.setAdapter(new
        // ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,
        // item));

        autoCompleteSongs.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                if (s.length() > 3) {

                    // Cancel the Timer and all scheduled tasks
                    t.cancel();
                    t.purge();
                    t = new Timer();

                    //Set the schedule function and rate
                    t.schedule(new TimerTask() {

                        @Override
                        public void run() 
                        {
                            //Called each time when 1000 milliseconds (1 second) (the period parameter)
                            searchTerms = s.toString();
                            searchTerms = searchTerms.replace(" ", "+");
                            // Buscamos por artista
                            AsyncHttpClient client = new AsyncHttpClient();
                            client.get("http://ws.spotify.com/search/1/artist.json?q="
                                    + searchTerms + "*", null,
                                    new JsonHttpResponseHandler() {
                                        public void onSuccess(JSONObject data) {
                                            try {
                                                // Hay artistas con ese nombre
                                                if (data.length() > 0) {
                                                    JSONArray artist = new JSONArray(
                                                            data.getJSONArray("artists")
                                                                    .toString());

                                                    for (int i = 0; i < 6; i++) {

                                                        JSONObject orden = artist
                                                                .getJSONObject(i);
                                                        String name = orden
                                                                .getString("name");
                                                        list.add(name);
                                                        arrayArtist[i] = name;
                                                        arrayTrack[i] = "";
                                                        nArtist++;
                                                    }
                                                } else {
                                                    bothsearchs = true;
                                                }
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }

                                        }

                                        @Override
                                        public void onFailure(Throwable arg0) {

                                        }
                                    });

                            // Buscamos por pista
                            client.get("http://ws.spotify.com/search/1/track.json?q="
                                    + searchTerms + "*", null,
                                    new JsonHttpResponseHandler() {
                                        public void onSuccess(JSONObject spoty) {
                                            try {
                                                JSONArray artist = new JSONArray(spoty
                                                        .getJSONArray("tracks")
                                                        .toString());

                                                for (int i = nArtist; i < nArtist + 6 ; i++) {
                                                    JSONObject orden = artist
                                                            .getJSONObject(i);
                                                    String name = orden
                                                            .getString("name");
                                                    JSONArray nameArtist = new JSONArray(
                                                            orden.getJSONArray(
                                                                    "artists")
                                                                    .toString());
                                                    JSONObject namArt = nameArtist
                                                            .getJSONObject(0);
                                                    String nameArt = namArt
                                                            .getString("name");

                                                    list.add("[" + nameArt + "] "
                                                            + name);
                                                    arrayArtist[i] = nameArt;
                                                    arrayTrack[i] = name;
                                                }

                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }
                                        }

                                        @Override
                                        public void onFailure(Throwable arg0) {
                                        }

                                    });

                            list.notifyDataSetChanged();
                            TextView text = (TextView) findViewById(R.id.petitionTextView);

                            for(int i = 0; i < 12; i++){
                                Log.i("AART", "" + arrayArtist[i]);
                                Log.i("ATRA", "" + arrayTrack[i]);
                                }

                            if(arrayArtist[0] == null && arrayTrack[0] == ""){
                                text.setText("No hay resultados");
                            }else{

                                for(int i = 0; i < 12; i++){
                                    String register = "<font color=#64c7eb>" + arrayArtist[i] + "</font> <font color=#272527>" + arrayTrack[i] + "</font></br>";
                                    text.setText(Html.fromHtml(register));
                                }
                            }
                        }

                    },
                    //Set how long before to start calling the TimerTask (in milliseconds)
                    0,
                    //Set the amount of time between each execution (in milliseconds)
                    1000);

                }
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            public void afterTextChanged(Editable s) {
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.search_music, menu);
        return true;
    }

}
于 2013-06-03T14:23:12.430 に答える