1

Я создал класс AsyncTask, в котором я пишу эту часть (onPreExecute и doInBackgrond методы):java.lang.IllegalStateException: Невозможно выполнить эту операцию, так как не существует текущая транзакция

@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; 
} 

Я всегда работал хорошо, но сегодня после некоторых изменений в других классах и после установки 2 пакетов из Android SDK Manager он прекратил работу. (я установил Android SDK Build-Tools v20 и Android SDK Tools в версию 23.0.5).

Теперь я получаю эту ошибку: java.lang.IllegalStateException: Невозможно выполнить эту операцию, так как не существует текущая транзакция

Вот мой 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) 

В строке 49 есть это:

dialog.show(); 

Интернет 114 есть это:

localDB.endTransaction(); 

Очень странно ... в чем проблема? Спасибо.

ответ

2

вы могли ударять исключение, прежде чем 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(); 
} 
+0

Исправить это исключение, но теперь ничего не записывается на локальный db. numUsers i always 0. – smartmouse

+1

@smartmouse вы видите какой-либо стекtrace ... дважды проверьте свой 'connectAndCreateJsonArray' – ashoke

+0

Дело в том, что этот класс работал нормально до нескольких часов назад. Затем я сделал некоторые незначительные изменения в других классах, и я установил некоторые новые SDK-файлы, как я уже говорил. Может быть проблема с SDK? – smartmouse

0

У меня есть ошибка, как ваши, вот мой код:

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(); 
} 

Я использую возврат до db.beginTransaction(), мой код возврат до beginTransaction, но я endTransaction в finally. Если вы не сделаете beginTransaction и endTransaction, появится исключение.

+0

поэтому проверьте свой код на db.beginTransaction и endTransaction.Hope это поможет вам. – doordoor

0

насчет

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

вместо "... переместить, наконец, еще одну попытку блока внутри"?

Смежные вопросы