0

音楽ゲームで 10 曲のいずれかを再生しているときに IndexOutOfBound Exception を受け取る理由がわかりません。計算が完了するまで待機する asynctask.get() を使用しても、どういうわけか、10 曲の情報 (dieciCanzoni) でリストを埋めるのをスキップしていると思います。

助けてください。

ありがとうございました!

ログキャット:

11-26 10:29:49.441: E/AndroidRuntime(7509): FATAL EXCEPTION: main
11-26 10:29:49.441: E/AndroidRuntime(7509): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
11-26 10:29:49.441: E/AndroidRuntime(7509):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at java.util.ArrayList.get(ArrayList.java:304)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at com.guessthesetunes.Canzone.onCompletion(Canzone.java:539)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1528)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at android.os.Looper.loop(Looper.java:137)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at android.app.ActivityThread.main(ActivityThread.java:4575)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at java.lang.reflect.Method.invokeNative(Native Method)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at java.lang.reflect.Method.invoke(Method.java:511)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
11-26 10:29:49.441: E/AndroidRuntime(7509):     at dalvik.system.NativeStart.main(Native Method)

メディアプレーヤーを初期化するメソッドを呼び出す次の行でエラーが発生します: PlayStream(dieciCanzoni.get(i).get(0));

私が使用している AsyncTask のコード:

class Json extends AsyncTask<String, String, String>
{
List<String> canzoni = new ArrayList<String>(5);
ProgressDialog pDialog;
int[] arrayGenere;
Context context;

public Json(int[] arrayGenere,Context context) 
{
    this.arrayGenere = arrayGenere;
    this.context = context;
}

@Override
protected void onPreExecute()
{
    super.onPreExecute();
    pDialog = new ProgressDialog(context);
    pDialog.setMessage("Preparazione Round...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();
}

protected String doInBackground(String... params) 
{
    try
    {       
        int randomLookupId;
        JSONObject obj;                         
        JSONArray jsonArray;    

        for(int i = 0; i < 10; i++)
        {
            canzoni = new ArrayList<String>();

            obj = getJSONObject(scegliClassifica(arrayGenere));
            jsonArray = obj.getJSONArray("resultIds");

            randomLookupId = new Random().nextInt(jsonArray.length());  

            JSONObject finalObj = getJSONObject("http://itunes.apple.com/lookup?id="+jsonArray.getString(randomLookupId)); 
            JSONArray finalJsonArray = finalObj.getJSONArray("results");    

            JSONObject returnObj = finalJsonArray.getJSONObject(0);

            canzoni.add(returnObj.getString("previewUrl"));
            canzoni.add(returnObj.getString("artistName"));
            canzoni.add(returnObj.getString("trackName"));
            canzoni.add(returnObj.getString("artistViewUrl"));
            canzoni.add(returnObj.getString("artworkUrl100"));

            Canzone.dieciCanzoni.add(i, new ArrayList<String>(canzoni));
        }
    }   
    catch (JSONException ignored)
    {
        ignored.getCause();
    }
    catch (MalformedURLException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}

private String scegliClassifica(int[] arrayGenere)
{
    int randomArrayPosition = new Random().nextInt(arrayGenere.length);
    return "http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g="+arrayGenere[randomArrayPosition]+"&name=Songs&limit=300";
}

@Override
protected void onPostExecute(String stringa)
{
    pDialog.dismiss();
}

JSONObject getJSONObject(String url) throws IOException, MalformedURLException, JSONException
{

    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();

    InputStream in = conn.getInputStream();

    try
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader r = new BufferedReader(new InputStreamReader(new DoneHandlerInputStream(in)));
        for (String line = r.readLine(); line != null; line = r.readLine())
        {
            sb.append(line);
        }
        return new JSONObject(sb.toString());
    }
    finally
    {
        in.close();
    }
}
}

これは Asynctask への呼び出しです。

try {
        new Json(arrayGenere,Canzone.this).execute().get(15000,TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TimeoutException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

編集:

JsonArray のサイズを JsonArray.length()-1 に変更した後も機能しません!!! たとえば、あるケースでは、クラス Json が List の 2 つの要素しか満たしていませんが、その理由がわかりません!

みんなを喜ばせるのを手伝ってもらえますか?ありがとう

4

2 に答える 2

1

配列の最初の要素はインデックス0であることを忘れないでください。そのため、長さは最高のインデックスより1長くなるため、randomLookupId使用する前にから1を引く必要があります。

(長さが1の配列を検討してください。常に、インデックス0をランダムに選択する必要があります)

于 2012-11-26T10:18:45.623 に答える
0

あなたdoInBackgroundの方法であなたはどのようにあなたが「合法的なサイズ」の範囲内にいることを知っていますか?

メソッド全体は、誤った/ハードコードされた仮定に基づいて構築されています...

于 2012-11-26T09:55:59.490 に答える