Ошибка индекса вне диапазона после добавления AsyncTask - PullRequest
0 голосов
/ 14 марта 2012

Итак, у меня был закулисный поток, который заботился о некоторых сетевых вещах для приложения, но по какой-то причине IDE продолжал думать, что я обновлял пользовательский интерфейс, чтобы он не переставал падать. Я изменил его на AsyncTask, и теперь я получаю ошибку Index Out of Range. До того, как я начал работать с потоками, приложение работало нормально, оно было очень медленным. Я не изменил ни один оригинальный код, который работал, я только добавил к нему с потоками. Так что я знаю, что мой оригинальный код - это не проблема, а код, который создает AsyncTask, или, по крайней мере, это должен быть этот код. Мой код показан ниже вместе с ошибками:

Основной файл Java

package shc_BalloonSat.namespace;
import java.text.DecimalFormat;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.TextView;
import android.widget.Toast;

public class Shc_BalloonSat_Activity extends Activity
{
int historyCountFromUser;
httpAPI api;
mapAPI map;
runDialog dialog;
DecimalFormat df = new DecimalFormat("##.#####");
DecimalFormat decimalf = new DecimalFormat("##.######");
AlertDialog alert;
SharedPreferences pref;
Editor prefEditor;
String lastpacketsPHP;


// User to determine how many packet the user would like to see.
int userDefinedCount = 5;

/*
 *  Called when the activity is first created. 
*/

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    loadApp();
}

public boolean isNetworkConnected(Context context)
{
    ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectionManager.getActiveNetworkInfo() != null && connectionManager.getActiveNetworkInfo().isAvailable() && connectionManager.getActiveNetworkInfo().isConnected())
    {
        return true;
    }

    else 
    {
        return false;
    }
}

public void showAlert()
{
    alert.setTitle("Sorry!");
    alert.setMessage("Please connect to the internet to access the full functionality of this app.");
    alert.setButton("OK", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int which)
        {

        }
    });
    alert.show();
}

/*  public void onResume()
{
    super.onResume();
    loadApp();
}

public void onRestart()
{
    super.onRestart();
    loadApp();
}*/

public void loadApp()
{
    setContentView(shc_BalloonSat.namespace.R.layout.main);
    alert = new AlertDialog.Builder(this).create();
    String returned = "";
    lastpacketsPHP = "";
    pref = getSharedPreferences("shared_prefs", 0);
    prefEditor = pref.edit();
    prefEditor.putString(lastpacketsPHP, "/* PHP file URL goes here */");
    prefEditor.commit();

    // These next two lines are used to test the PHP files on the SHC server by determining if PHP is set up correctly.
    //prefEditor.putString(lastpacketsPHP, "/* PHP file URL goes here */");
    //prefEditor.commit();   

    if (!isNetworkConnected(this))
    {
    showAlert();
    }

    else
    {
    api = new httpAPI(this);
        map = new mapAPI(this);
        dialog = new runDialog();

        try
        {
            returned = api.getData();
        }

    catch (Exception e)
    {
        Toast.makeText(this, "Error: Unable to receive data at this time.", Toast.LENGTH_SHORT).show();
    }

        TextView infoTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.info);
    infoTV.setText(returned);
    assignInfoToInfoTextView();
    assignInfoToHistoryTextView();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(shc_BalloonSat.namespace.R.menu.mainmenu, menu);

    SubMenu submenu = menu.addSubMenu(0, Menu.FIRST, Menu.NONE, "Preferences");
    submenu.add(0, 5, Menu.NONE, "Get Last 5 Packets");
    submenu.add(0, 10, Menu.NONE, "Get Last 10 Packets");
    submenu.add(0, 20, Menu.NONE, "Get Last 20 Packets");
    inflater.inflate(shc_BalloonSat.namespace.R.menu.mainmenu, submenu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    // Handle item selection
    switch (item.getItemId())
    {
        case shc_BalloonSat.namespace.R.id.viewKML:
            viewKML();
            return true;
        case 5:
            viewLast5Packets();
            return true;
        case 10:
            viewLast10Packets();
            return true;
        case 20:
            viewLast20Packets();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

public void assignInfoToInfoTextView()
{
    TextView infoTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.info);

    try
    {
        String result = api.result.substring(1, api.result.length()-2);
        JSONObject json_data = new JSONObject(result);

    double altitudeData = json_data.getDouble("altitude");
    double altitudeInFeet = altitudeData * 3.281;
    String infoText = "Last Known Altitude: " + df.format(altitudeInFeet) + " ft\n";

    Double speedData = json_data.optDouble("speed");

    if (speedData.isNaN())
    {
        speedData = 0.00;
    }

    Double direction = json_data.optDouble("heading");
    String directionUnits = " degrees from N";
        String directionText = "";

        if (direction == 0)
        {
            directionText = ", N";
        }
        else if (direction > 0 && direction < 45)
        {
            directionText = ", N NE";
        }

        else if (direction == 45)
        {
            directionText = ", NE";
        }

        else if (direction > 45 && direction < 90)
        {
            directionText = ", E NE";
        }

        else if (direction == 90)
        {
            directionText = ", E";
        }

        else if (direction > 90 && direction < 135)
        {
            directionText = ", E SE";
        }

        else if (direction == 135)
        {
            directionText = ", SE";
        }

        else if (direction > 135 && direction < 180)
        {
            directionText = ", S SE";
        }

        else if (direction == 180)
        {
            directionText = ", S";
        }

        else if (direction > 180 && direction < 225)
        {
            directionText = ", S SW";
        }

        else if (direction == 225)
        {
            directionText = ", SW";
        }

        else if (direction > 225 && direction < 270)
        {
            directionText = ", W SW";
        }

        else if (direction == 270)
        {
            directionText = ", W";
        }

        else if (direction > 270 && direction < 315)
        {
            directionText = ", W NW";
        }

        else if (direction == 315)
        {
            directionText = ", NW";
        }

        else if (direction > 315 && direction < 360)
        {
            directionText = ", N NW";
        }

        else if (direction.isNaN())
        {
        directionText = " Invalid direction";
        }

        else
            {

            }

        infoText += "Last Known Velocity: " + df.format(speedData) + " m/s " + direction + directionUnits + directionText + "\n";

    double recentLatitudeData = json_data.getDouble("latitude");
    infoText += "Last Known Latitude: " + df.format(recentLatitudeData) + "\n";

    double recentLongitudeData = json_data.getDouble("longitude");
    infoText += "Last Known Longtitude: " + df.format(recentLongitudeData) + "\n";

    infoTV.setText(infoText);
    }

    catch (JSONException e)
    {
        // TODO Auto-generated catch block
        Log.e("<tag>", e.getMessage());
        Toast.makeText(this,"Error in (Last Known) method!",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e)
    {
        Log.e("<tag>", e.getMessage());
        Toast.makeText(this,"Error in (Last Known) method!",Toast.LENGTH_SHORT).show();
    }
}

public void assignInfoToHistoryTextView()
{

    try
    {
        JSONArray jArray = new JSONArray(api.result);
        TextView historyTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.history);

        for (int count = 1; count < userDefinedCount; count++)
        {
                JSONObject json_data = jArray.getJSONObject(count);

                double altitudeData = json_data.getDouble("altitude");
                double altitudeInFeet = altitudeData * 3.281;
                String historyText = "Altitude: " + decimalf.format(altitudeInFeet) + " ft\n";

                Double speedData = json_data.optDouble("speed");

                if (speedData.isNaN())
                {
                    speedData = 0.00;
                }

                    Double direction = json_data.optDouble("heading");
                    String directionUnits = " degrees from N";
            String directionText = "";

            if (direction == 0)
            {
                directionText = ", N";
            }
            else if (direction > 0 && direction < 45)
            {
                directionText = ", N NE";
            }

            else if (direction == 45)
            {
                directionText = ", NE";
            }

            else if (direction > 45 && direction < 90)
            {
                directionText = ", E NE";
            }

            else if (direction == 90)
            {
                directionText = ", E";
            }

            else if (direction > 90 && direction < 135)
            {
                directionText = ", E SE";
            }

            else if (direction == 135)
            {
                directionText = ", SE";
            }

            else if (direction > 135 && direction < 180)
            {
                directionText = ", S SE";
            }

            else if (direction == 180)
            {
                directionText = ", S";
            }

            else if (direction > 180 && direction < 225)
            {
                directionText = ", S SW";
            }

            else if (direction == 225)
            {
                directionText = ", SW";
            }

            else if (direction > 225 && direction < 270)
            {
                directionText = ", W SW";
            }

            else if (direction == 270)
            {
                directionText = ", W";
            }

            else if (direction > 270 && direction < 315)
            {
                directionText = ", W NW";
            }

            else if (direction == 315)
            {
                directionText = ", NW";
            }

            else if (direction > 315 && direction < 360)
            {
                directionText = ", N NW";
            }

            else if (direction.isNaN())
            {
                directionText = " Invalid direction";
            }

            else
            {

            }

            if (direction.isNaN())
            {
                historyText += "Velocity: " + df.format(speedData) + " m/s " + directionText + "\n";
            }

            else
            {
                historyText += "Velocity: " + df.format(speedData) + " m/s,\n" + direction + directionUnits + directionText + "\n";
            }

                double latitudeData = json_data.getDouble("latitude");
                historyText += "Latitude: " + df.format(latitudeData) + "\n";

                double longitudeData = json_data.getDouble("longitude");
                historyText += "Longtitude: " + df.format(longitudeData) + "\n\n";

                historyTV.setText(historyText);
        }
    }

    catch (JSONException e)
    {
        // TODO Auto-generated catch block
        Log.e("log_tag", "Error parsing data: " + e.toString());
    }
    catch(Exception e)
    {
        Log.e("log_tag", "Error parsing data: " + e.toString());
    }

}

void viewLast5Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 5;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_5_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

void viewLast10Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 10;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_10_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

void viewLast20Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 20;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_20_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

public void viewKML()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        map.openKML();
    }
}
}  

httpAPI.java

package shc_BalloonSat.namespace;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import android.util.Log;

public class httpAPI
{
Shc_BalloonSat_Activity shc;
HttpClient client;
ArrayList<NameValuePair> nameValuePairs;
HttpResponse response;
HttpEntity entity;
InputStream is;
String result = "";
HttpPost httppost;

 public httpAPI(Shc_BalloonSat_Activity aContext)
 {
        shc = aContext;
 }

public String getData() throws Exception
{
    try
    {
    client = new DefaultHttpClient();
    nameValuePairs = new ArrayList<NameValuePair>();
    httppost = new HttpPost(shc.pref.getString(shc.lastpacketsPHP, shc.lastpacketsPHP.toString()));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    response = client.execute(httppost);
    entity = response.getEntity();
    is = entity.getContent();
    }

    catch (Exception e)
    {
    Log.e("log_tag", "Error in HTTP connection: " + e.toString());
    }

    try
    {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;

        while ((line = reader.readLine()) != null)
        {
                sb.append(line + "\n");
        }

        is.close();

        result = sb.toString();
    }

    catch(Exception e)
    {
    Log.e("log_tag", "Error converting result: " + e.toString());
    }

    return result;
}
}

runDialog.java

package shc_BalloonSat.namespace;
import android.app.ProgressDialog;
import android.os.AsyncTask;

public class runDialog extends AsyncTask<String, Integer, String>
{
Shc_BalloonSat_Activity shc;
httpAPI api;
ProgressDialog progressDialog;

public void onPreExecute()
{
progressDialog = new ProgressDialog(shc);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
}

@Override
protected String doInBackground(String... params)
{
for (int count = 0; count < 20; count++)
{
    publishProgress(5);

    try
    {
    api.getData();
    }

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

progressDialog.dismiss();
return null;
}

protected void onProgressUpdate(Integer...progress)
{
progressDialog.incrementProgressBy(progress[0]);
}

protected void onPostExecute()
{

}
}

Ошибка:

org.json.JSONException: Index 5 out of range [0..5)

Я получаю эту ошибку каждый раз, когда он пытается получить данные из URL. Я также могу отправить по электронной почте файл apk любому, кто хотел бы увидеть, что он на самом деле делает. У меня также есть основания полагать, что причина этого также может быть причиной того, что мой ProgressDialog не будет отображаться. Любые идеи о том, почему я мог получить эту ошибку?

1 Ответ

0 голосов
/ 29 марта 2012

Оказывается, я проходил действие, неправильно вызывал ProgressDialog и неправильно настроил AsyncTask. Слава Богу, я нашел кого-то, у кого было время, чтобы отладить мой проект для меня.

...