简体   繁体   English

java.lang.IllegalStateException:无法执行此操作,因为没有当前事务

[英]java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction

I created an AsyncTask class in which i write this part (onPreExecute and doInBackgrond methods): 我创建了一个AsyncTask类,其中编写了这一部分(onPreExecute和doInBackgrond方法):

@Override
protected void onPreExecute() {
    // Instantiate ProgressDialog and Set style to STYLE_HORIZONTAL
    dialog = new ProgressDialog(context);
    dialog.setIndeterminate(false);
    dialog.setMax(100);
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setCancelable(false);
    dialog.setTitle("Update");
    dialog.setMessage("Download data. Please wait...");
    dialog.show();

    super.onPreExecute();
}

@Override
protected String doInBackground(String... urls) {
    int count = 0;
    int numUsers = 0;
    db = new Database(context);
    SQLiteDatabase localDB = db.getWritableDatabase();

    try {   
        JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);

        numUsers = UserJsonArray.length();

        localDB.beginTransaction();

        for (int i = 0; i < numUsers; i++) {
            JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);

            localDB.insert("Users", null, getParsedUserEntry(jObj));

            count++;
            publishProgress(count * 100 / numUsers);
        }

        localDB.setTransactionSuccessful();

    } catch (IllegalStateException e) {
        e.printStackTrace();                
    } catch (JSONException e) {
        e.printStackTrace();
        Log.e("Msg", "catch");
    } finally {
        localDB.endTransaction();
    }

    return numUsers+"";
}

private JSONArray connectAndCreateJsonArray(String url) {
    JSONArray jsonArray = new JSONArray();

    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("http://www.example.com/file.json");
    request.addHeader("Cache-Control", "no-cache");

    try {
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        InputStreamReader in = new InputStreamReader(entity.getContent());
        BufferedReader reader = new BufferedReader(in);
        StringBuilder stringBuilder = new StringBuilder();
        String line = "";

        while ((line=reader.readLine()) != null) {
            stringBuilder.append(line);
        }

        jsonArray = new JSONArray(stringBuilder.toString());

    } catch (SocketTimeoutException e) {
        e.printStackTrace();
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();                
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return jsonArray;
}

I have always worked fine, but today after some modifies to other classes and after installing 2 package from Android SDK Manager, it stopped to work. 我一直工作得很好,但是今天在将某些内容修改为其他类之后,并从Android SDK Manager安装了2个软件包后,它停止工作了。 (i installed Android SDK Build-Tools v20 and Android SDK Tools to version 23.0.5). (我安装了Android SDK Build-Tools v20和Android SDK Tools到版本23.0.5)。

Now i get this error: java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction 现在我收到此错误: java.lang.IllegalStateException:无法执行此操作,因为没有当前事务

Here is my LogCat: 这是我的LogCat:

10-13 02:11:36.700: E/AndroidRuntime(31210): FATAL EXCEPTION: AsyncTask #1
10-13 02:11:36.700: E/AndroidRuntime(31210): Process: com.example.myapp, PID: 31210
10-13 02:11:36.700: E/AndroidRuntime(31210): java.lang.RuntimeException: An error occured while executing doInBackground()
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.lang.Thread.run(Thread.java:841)
10-13 02:11:36.700: E/AndroidRuntime(31210): Caused by: java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.database.sqlite.SQLiteSession.throwIfNoTransaction(SQLiteSession.java:915)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:398)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at com.example.myapp.DownloadDataFromServer.doInBackground(DownloadDataFromServer.java:114)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at com.example.myapp.DownloadDataFromServer.doInBackground(DownloadDataFromServer.java:1)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
10-13 02:11:36.700: E/AndroidRuntime(31210):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-13 02:11:36.700: E/AndroidRuntime(31210):    ... 4 more
10-13 02:11:37.765: E/WindowManager(31210): android.view.WindowLeaked: Activity com.example.myapp.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{420f12e8 V.E..... R....... 0,0-480,322} that was originally added here
10-13 02:11:37.765: E/WindowManager(31210):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:346)
10-13 02:11:37.765: E/WindowManager(31210):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
10-13 02:11:37.765: E/WindowManager(31210):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-13 02:11:37.765: E/WindowManager(31210):     at android.app.Dialog.show(Dialog.java:286)
10-13 02:11:37.765: E/WindowManager(31210):     at com.example.myapp.DownloadDataFromServer.onPreExecute(DownloadDataFromServer.java:49)
10-13 02:11:37.765: E/WindowManager(31210):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
10-13 02:11:37.765: E/WindowManager(31210):     at android.os.AsyncTask.execute(AsyncTask.java:535)
10-13 02:11:37.765: E/WindowManager(31210):     at com.example.myapp.Main.onOptionsItemSelected(Main.java:151)
10-13 02:11:37.765: E/WindowManager(31210):     at android.app.Activity.onMenuItemSelected(Activity.java:2600)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1065)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:177)
10-13 02:11:37.765: E/WindowManager(31210):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
10-13 02:11:37.765: E/WindowManager(31210):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
10-13 02:11:37.765: E/WindowManager(31210):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
10-13 02:11:37.765: E/WindowManager(31210):     at android.widget.AbsListView$3.run(AbsListView.java:3645)
10-13 02:11:37.765: E/WindowManager(31210):     at android.os.Handler.handleCallback(Handler.java:733)
10-13 02:11:37.765: E/WindowManager(31210):     at android.os.Handler.dispatchMessage(Handler.java:95)
10-13 02:11:37.765: E/WindowManager(31210):     at android.os.Looper.loop(Looper.java:136)
10-13 02:11:37.765: E/WindowManager(31210):     at android.app.ActivityThread.main(ActivityThread.java:5146)
10-13 02:11:37.765: E/WindowManager(31210):     at java.lang.reflect.Method.invokeNative(Native Method)
10-13 02:11:37.765: E/WindowManager(31210):     at java.lang.reflect.Method.invoke(Method.java:515)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
10-13 02:11:37.765: E/WindowManager(31210):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
10-13 02:11:37.765: E/WindowManager(31210):     at dalvik.system.NativeStart.main(Native Method)

On line 49 there is this: 在第49行上是这样的:

dialog.show();

Online 114 there is this: 在线114有这个:

localDB.endTransaction();

It is very strange... what could be the problem? 这很奇怪...可能是什么问题? Thank you. 谢谢。

you could be hitting an exception before beginTransaction ..move the finally to another try block inside 你可能会打一个异常之前beginTransaction ..move的finally到另一个try块内

try {   
    JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
    numUsers = UserJsonArray.length();
    if (numUsers < 1) return numUsers + "";
    try {  
        localDB.beginTransaction();          
        for (int i = 0; i < numUsers; i++) {
            JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
            localDB.insert("Users", null, getParsedUserEntry(jObj));
           count++;
           publishProgress(count * 100 / numUsers);
        }
        localDB.setTransactionSuccessful();
    } catch (IllegalStateException e) {
        e.printStackTrace();                
    } catch (JSONException e) {
        e.printStackTrace();
        Log.e("Msg", "catch");
    } catch (Exception e) { // everything else
        e.printStackTrace();
    } finally {
        localDB.endTransaction();
    }
} catch (Exception e) { // everything else
    e.printStackTrace();
}

what about 关于什么

try{
  ...
} catch (Exception e) { // everything else
    e.printStackTrace();
} finally {
    if(localDB != null && localDB.inTransation()){
         localDB.endTransaction();
    }
}

instead of " ... move the finally to another try block inside" ? 而不是“ ...将最终移动到另一个try块中”?

In your code, if an exception occurs before localDB.beginTransaction(); 在您的代码中,如果在localDB.beginTransaction();之前发生异常localDB.beginTransaction(); then the transaction will not be opened, and due to the fact that in finally block you are trying to close it, an IllegalStateException will be thrown (transaction has not been started). 那么该事务将不会打开,并且由于您在finally块中尝试关闭该事务,将IllegalStateException (尚未启动事务)。

Replace this code: 替换此代码:

try {   
    JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
    numUsers = UserJsonArray.length();

    localDB.beginTransaction();

    for (int i = 0; i < numUsers; i++) {
        JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
        localDB.insert("Users", null, getParsedUserEntry(jObj));
        count++;
        publishProgress(count * 100 / numUsers);
    }

    localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
    e.printStackTrace();                
} catch (JSONException e) {
     e.printStackTrace();
    Log.e("Msg", "catch");
} finally {
    localDB.endTransaction();
}

On this code: 在此代码上:

JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
numUsers = UserJsonArray.length();

localDB.beginTransaction();

try {   
    for (int i = 0; i < numUsers; i++) {
        JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
        localDB.insert("Users", null, getParsedUserEntry(jObj));
        count++;
        publishProgress(count * 100 / numUsers);
    }

    localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
    e.printStackTrace();                
} catch (JSONException e) {
     e.printStackTrace();
    Log.e("Msg", "catch");
} finally {
    localDB.endTransaction();
}

If necessary, the first two lines can be wrapped in a separate try-catch . 如有必要,可以将前两行包装在单独的try-catch

I have an error like yours, here is my code: 我有一个像您一样的错误,这是我的代码:

try {
    String sql = "SELECT * FROM "+DB_TABLEDOWNLOAD;
    Cursor cursor = db.rawQuery(sql, null);
    //空双引号为原表没有的字段
    String temp = "";
    int existIconPath = cursor.getColumnIndex("iconPath");
    int existAudioID = cursor.getColumnIndex("audioID");

    if (existIconPath == -1 && existAudioID == -1){
        temp = "url, downed,total,path,name, audioTitle, audioFileID,\"\",\"\"";
    }else if (existIconPath == -1 && existAudioID != -1){//iconPath不存在
        temp = "url, downed,total,path,name, audioTitle, audioFileID,\"\",audioID";
    }else if (existIconPath != -1 && existAudioID == -1){//audioID不存在
        temp = "url, downed,total,path,name, audioTitle, audioFileID,iconPath,\"\"";
    }else {
        return;
    }

    db.beginTransaction();
    String tempTableName = "_temp_"+DB_TABLEDOWNLOAD;
    String sqlCreateTemp = " ALTER TABLE "+DB_TABLEDOWNLOAD+" RENAME TO "+tempTableName+";";
     db.execSQL(sqlCreateTemp);

     final String TB_TESTPAPERINFO_CREATE = "Create  TABLE IF NOT EXISTS " 
                  + DB_TABLEDOWNLOAD
                  + "(url TEXT, downed TEXT,total TEXT,path TEXT,name TEXT, audioTitle TEXT, audioFileID TEXT,iconPath TEXT, audioID TEXT);";
     db.execSQL(TB_TESTPAPERINFO_CREATE);

     String sqlBackupData = "INSERT INTO "+DB_TABLEDOWNLOAD+" SELECT "+temp+" FROM "+tempTableName+";";
     db.execSQL(sqlBackupData);
     String sqlDrop = "DROP TABLE IF EXISTS '"+tempTableName+"';";
     db.execSQL(sqlDrop);
     db.setTransactionSuccessful();
} catch (Exception e) {
    e.printStackTrace();
}finally{
    db.endTransaction();
}

I use return before db.beginTransaction() , my code return before beginTransaction , but I endTransaction in finally . 我用回之前db.beginTransaction()之前我的代码返回beginTransaction ,但我endTransactionfinally If you do not beginTransaction and endTransaction , the exception will appear. 如果您没有beginTransactionendTransaction ,则会出现异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android Room JUnit 测试:“AsyncTask #1” java.lang.IllegalStateException:无法执行此操作,因为当前没有事务 - Android Room JUnit testing: "AsyncTask #1" java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction java.lang.IllegalStateException:无法对未密封的实例执行此操作 - java.lang.IllegalStateException: Cannot perform this action on a not sealed instance “无法在未密封的实例上执行此操作”java.lang.IllegalStateException异常 - “Cannot perform this action on a not sealed instance” java.lang.IllegalStateException exception 无法执行操作,因为插入数据库时​​没有当前事务 - Cannot perform operation because there is no current transaction when inserting into database java.lang.IllegalStateException? - java.lang.IllegalStateException? “java.lang.IllegalStateException:无法对密封实例执行此操作。” 致命例外:主要 - "java.lang.IllegalStateException: Cannot perform this action on a sealed instance." FATAL EXCEPTION: main 为什么java.lang.IllegalStateException: no transaction pending以及如何解决 - why java.lang.IllegalStateException: no transaction pending and how to solve java.lang.IllegalStateException:onSaveInstanceState之后无法执行此操作 - java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState java.lang.IllegalStateException:onSaveInstanceState,FragmentTabHost之后无法执行此操作 - java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState,FragmentTabHost Android java.lang.IllegalStateException:onSaveInstanceState之后无法执行此操作 - Android java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM