2012-03-14 11 views
0

私は、バックグラウンドでアプリのネットワークの処理をしていたスレッドを持っていましたが、何らかの理由でIDEがUIを更新していると思っていました。 tはクラッシュを止める。私はそれをAsyncTaskに変更しましたが、今度はIndex Out of Rangeエラーが発生します。スレッドを使って作業を開始する前に、アプリケーションはうまくいきましたが、それは本当に遅かったです。私はスレッドでそれに追加した元のコードを変更していません。だから私は元のコードが問題ではないことを知っています。それはAsyncTaskを作成するコード、または少なくともそのコードでなければなりません。私のコードは、エラーとともに以下に示します。AsyncTaskを追加した後にインデックスが範囲外になるエラー

メイン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() 
{ 

} 
} 
runDialog.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; 
} 
} 

を提出しますの

エラー:

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

私は、このエラーにはURLからデータを取得しようとするたびに取得します。また、実際に何をしているのかを知りたい人には、apkファイルをメールで送信することもできます。私はまたこれの原因が、私のProgressDialogが表示されない原因になっていると信じる理由があります。なぜ私はこのエラーを得ることができるかに関する任意のアイデア?

+0

メインアクティビティでrunDialogが呼び出されず、http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycleも参照してください(loadApp()が2回呼び出されるようです)おそらくあなたが望んでいないほとんどの時間。 – mkso

+0

私はloadApp()が複数回呼び出されたときにあなたが正しいと信じています。私がここで読んだことから:http://stackoverflow.com/questions/8515936/android-activity-life-cycle-difference-between-onpause-and-onstop私はそのスレッドで理解したことから、複数回呼び出されます。他のクラスと同様に、私はelse文でrunDialogを呼び出しました。私は自分のコードを更新して、現在のものと一致させました。 – tylerbhughes

答えて

-2

アクティビティを渡していて、ProgressDialogを正しく呼び出さず、AsyncTaskを正しく設定していないことがわかります。私のために私のプロジェクトをデバッグする時間を持っていた誰かを見つけました。

+0

私は同様の問題に直面しています。あなたのコードで何が正確に変更されたのか教えていただけますか? – gauravsapiens

関連する問題