【问题标题】:asynctask fatal exception #1 in loadermanagerloadermanager 中的 asynctask 致命异常 #1
【发布时间】: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


    【解决方案1】:

    您在 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 的另一个示例。

    【讨论】:

      【解决方案2】:

      由于我无法发表评论,所以我会写下我的建议作为答案。 您覆盖的其中一种方法可能使用 asynctask 来执行后台工作。当您尝试更改 UI 元素或应在 UIThread 上运行的任何内容时,会发生此异常。尝试检查您正在执行 UIThread 工作的函数,并从开发者网站查看该函数的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 2015-07-16
        • 2015-07-12
        相关资源
        最近更新 更多