0

AsyncTask を使用して、アプリが必要とするすべてのデータをサーバーから取得しています。これはうまくいきます。ただし、アプリケーションを 2 回目に再起動すると、アプリケーションがクラッシュします。

次のエラーログが表示されます。

04-17 14:22:57.171: E/AndroidRuntime(956): FATAL EXCEPTION: AsyncTask #2
04-17 14:22:57.171: E/AndroidRuntime(956): java.lang.RuntimeException: An error occured while executing doInBackground()
04-17 14:22:57.171: E/AndroidRuntime(956):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.lang.Thread.run(Thread.java:856)
04-17 14:22:57.171: E/AndroidRuntime(956): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=14; index=14
04-17 14:22:57.171: E/AndroidRuntime(956):  at flexform.ro.android.app.FlexFormActivity$getDataClass.doInBackground(FlexFormActivity.java:88) 
04-17 14:22:57.171: E/AndroidRuntime(956):  at flexform.ro.android.app.FlexFormActivity$getDataClass.doInBackground(FlexFormActivity.java:1)
04-17 14:22:57.171: E/AndroidRuntime(956):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
04-17 14:22:57.171: E/AndroidRuntime(956):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

以下に、私の asynctask クラスを示します。

class getDataClass extends AsyncTask<String, Void, String>{
    protected String doInBackground(String...urls){
        String response = "";
        for(String url : urls){
            response = "";
            descriptionArray_Counter++;

            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try{
                HttpResponse execute = client.execute(httpGet);
                InputStream content = execute.getEntity().getContent();

                BufferedReader buffer = new BufferedReader(new InputStreamReader(content));

                String s = "";

                while((s = buffer.readLine()) != null){
                    response += s;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            Resources.descriptionArray[descriptionArray_Counter] = response;
        }
        return response;
    }

    protected void onPostExecute(String result){
        Toast.makeText(getApplicationContext(), "All entres have been loaded!", Toast.LENGTH_SHORT).show();

        JSONArray offersJSON;
        JSONArray newsJSON;

        try{
            newsJSON = new JSONArray(Resources.descriptionArray[9]);

            if(newsJSON.length() > 20)
                Resources.newsLength = 20;
            else
                Resources.newsLength = newsJSON.length();

            for(int i = 0; i < Resources.newsLength; i++){
                JSONObject tempObject = newsJSON.getJSONObject(i);

                Resources.news_id[i] = tempObject.getString("id");
                Resources.news_title[i] = tempObject.getString("title");
                Resources.news_descriptionShort[i] = tempObject.getString("description_short");
                Resources.news_descriptionLong[i] = tempObject.getString("description_long");
                Resources.news_date[i] = tempObject.getString("date");
                Resources.news_urgent[i] = tempObject.getString("urgent");
            }
        }catch(JSONException e){
            e.printStackTrace();
        }
        try {
            offersJSON = new JSONArray(Resources.descriptionArray[10]);


        if(offersJSON.length() > 20)
            Resources.offersLength = 20;
        else
            Resources.offersLength = offersJSON.length();

        for(int i = 0; i < Resources.offersLength; i++){
            JSONObject tempObject = offersJSON.getJSONObject(i);

            Resources.offers_id[i] = tempObject.getString("id");
            Resources.offers_offertant[i] = tempObject.getString("Ofertant");
            Resources.offers_description[i] = tempObject.getString("Descriere");
            Resources.offers_contact[i] = tempObject.getString("Contact");
            Resources.offers_date[i] = tempObject.getString("Data");
            Resources.offers_available[i] = tempObject.getString("Valabil");

        } 
        Intent intent = new Intent(FlexFormActivity.this, MainMenu.class);
        startActivity(intent);

        }catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

もう少し経験のある人が、このクラッシュを回避するための適切で正しい方法を説明してくれることを願っています...

乾杯し、時間を割いて答えて助けてくれた人に感謝します...

4

2 に答える 2

3

descriptionArray_Counter を 0 にリセットすることは決してないと思います。したがって、タスクを実行すると、次の行

Resources.descriptionArray[descriptionArray_Counter] = response;

おそらく評価している

Resources.descriptionArray[14] = response;

記述配列の長さはわずか 14 です。スタック トレースで、これを正確に伝えていることがわかります。

于 2012-04-17T14:33:17.150 に答える
1

arrayIndexOutOfBounds エラーが発生しています。配列への呼び出しの 1 つ、特に 88 行目は範囲外です。asynchTask は問題ではありません。

于 2012-04-17T14:33:45.997 に答える