【发布时间】:2014-06-27 14:33:54
【问题描述】:
我的 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 应该没问题,在我看来错误就在这里,但我不知道在哪里......
感谢您的帮助
【问题讨论】:
标签: java android android-asynctask