我的loadermanager有一个问题,它应该从我的contentprovider中提取我的数据。 错误是:
06-27 10:14:29.053: E/AndroidRuntime(2270): FATAL EXCEPTION: AsyncTask #1
06-27 10:14:29.053: E/AndroidRuntime(2270): Process: com.trackme, PID: 2270
06-27 10:14:29.053: E/AndroidRuntime(2270): java.lang.RuntimeException: An error occured while executing doInBackground()
06-27 10:14:29.053: E/AndroidRuntime(2270): at android.os.AsyncTask$3.done(AsyncTask.java:300)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-27 10:14:29.053: E/AndroidRuntime(2270): at java.lang.Thread.run(Thread.java:841)
06-27 10:14:29.053: E/AndroidRuntime(2270): Caused by: java.lang.IndexOutOfBoundsException`
我的代码是:
public class RoutesListActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>{
public static final String TAG = "RouteList";
private static final int LOADER_ID = 1;
public static final int ACTIVITY_CREATE = 0;
public static final int ACTIVITY_RESULTS = 1;
private SimpleCursorAdapter mRoutesCursorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState){
Log.i(TAG, "onCreate della lista ");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_routes_list);
String[] from = new String[] {GeoProvider.KEY_ROWID};
int[] to = new int[] {R.id.route1};
mRoutesCursorAdapter = new SimpleCursorAdapter(this, R.layout.route_row, null, from, to, 0);
setListAdapter(mRoutesCursorAdapter);
//permette di interfacciare l'activity col loader
LoaderManager lm = getLoaderManager();
lm.initLoader(LOADER_ID, null, this);
registerForContextMenu(getListView());
Log.i(TAG, "Fine del metodo onCreate");
}
public boolean onCreateOptionMenu(Menu menu) {
Log.i(TAG, "Creazione dell'OptionMenu");
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.routes_list, menu);
return true;
}
public boolean onOptionItemSelected(MenuItem item) {
Log.i(TAG, "Selezione dell'item del menu ");
super.onOptionsItemSelected(item);
switch(item.getItemId()) {
case R.id.create_route:
createRoute();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Log.i(TAG, "selezione elemento della lista ");
super.onListItemClick(l, v, position, id);
showResults(id);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.context, menu);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
}
private void createRoute(){
Log.i(TAG , "createRoute");
Intent toRoute = new Intent(this, GeoActivity.class);
startActivityForResult(toRoute, ACTIVITY_CREATE);
}
private void deleteRoute(long id) {
Log.i(TAG , "deleteRoute");
Uri baseUri = GeoProvider.GEO_TABLE_URI;
Long idWrapper = Long.valueOf(id);
getContentResolver().delete(Uri.withAppendedPath(baseUri, idWrapper.toString()), null, null);
}
private void showResults(long id){
Log.i(TAG , "showResults");
Intent toResults = new Intent(this, Results.class);
toResults.putExtra(GeoProvider.KEY_ROWID, id);
startActivityForResult(toResults, ACTIVITY_RESULTS);
}
//il loader serve per il caricamento asincrono dei dati dal db
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args){
Log.i(TAG , "onCreateLoader");
return new CursorLoader(this, GeoProvider.GEO_TABLE_URI, new String[] {GeoProvider.KEY_ROWID},
null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Log.i(TAG , "onLoadFinished");
switch(loader.getId()){
case LOADER_ID:
Log.i(TAG , "onLoadFinished case LOADER_ID");
mRoutesCursorAdapter.swapCursor(cursor);
break;
}
Log.i(TAG , "fine onLoadFinished");
}
@Override
public void onLoaderReset(Loader<Cursor> arg0){
mRoutesCursorAdapter.swapCursor(null);
}
}
我无法理解为什么我在使用AsyncTask类时遇到此错误! 我的contentProvider应该没问题,在我看来错误就在这里,但我不知道在哪里......
感谢您的帮助
答案 0 :(得分:0)
您在AsyncTask中获得了IndexOutOfBoundsException。这意味着您正在尝试访问超出阵列范围的索引。代码示例:
int[] x = new int[5]; // x has size 5
int y = x[10]; // OutOfBounds since x has size of 5, and trying to access 11th element (index 10)
您的示例仅显示您的活动,因此我无法找到您更改AsyncTask的内容和位置,但您可以查看this一些相关问题,以查看另一个IndexOutOfBoundsException示例。
答案 1 :(得分:0)
由于我无法发表评论,我会将我的建议写成答案。 您覆盖的方法之一可能使用asynctask来执行后台工作。当您尝试更改UI元素或应在UIThread上运行的任何内容时,会发生此异常。尝试检查您正在执行UIThread工作的函数,并从开发人员站点查找该函数的工作方式。