装配工管理器中的asynctask致命异常#1

时间:2014-06-27 14:33:54

标签: java android android-asynctask

我的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应该没问题,在我看来错误就在这里,但我不知道在哪里......

感谢您的帮助

2 个答案:

答案 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工作的函数,并从开发人员站点查找该函数的工作方式。