2012-03-14 57 views
0

因此,我有一个线程正在幕后为应用程序处理一些网络资源,但由于某种原因,IDE一直在想我正在更新UI,不要停止崩溃。我将其更改为一个AsyncTask,现在我得到一个索引超出范围错误。在开始使用线程之前,应用程序工作正常,但实际上很慢。我没有改变我刚刚添加到线程中的任何原始代码。所以我知道我的原始代码不是问题,它是创建AsyncTask的代码,或者至少应该是代码。我的代码与错误一起如下图所示:添加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无法显示。任何想法,为什么我可以得到这个错误?

+0

我在主要活动中看不到调用runDialog,也请阅读http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle,好像loadApp()将被调用两次大部分时间你可能不想要。 – mkso 2012-03-14 18:11:13

+0

我相信你是正确的loadApp()被调用不止一次。从我刚刚在这里阅读:http://stackoverflow.com/questions/8515936/android-activity-life-cycle-difference-between-onpause-and-onstop从我在该线程中理解它将被称为多次。我还在其他语句中调用了runDialog,就像我做了其他类一样。我更新了我的代码以匹配它现在的状态。 – tylerbhughes 2012-03-15 16:26:03

回答

-2

原来,我传递了一个活动,没有正确调用ProgressDialog,并且错误地设置了我的AsyncTask。谢天谢地,我发现有人有时间为我调试我的项目。

+0

我正面临类似的问题。你能告诉我你的代码做了什么确切的改变吗? – gauravsapiens 2013-01-30 10:55:00