2014-02-21 2 views
0

При попытке выполнить подпрограмму резервного копирования Asynctask, которая вызывается из другого класса, я получаю сообщение «Невозможно создать экземпляр активности для android.app. Мероприятия." Компиляция идет нормально, но выполнение не выполняется. Я сделал исследование по намерениям и просто не могу найти выход. Мне важно знать, что происходит, поскольку я планирую сделать другие классы вызывать Asynctasks в течение срока действия приложения. Пожалуйста, дайте мне знать, если требуется больше данных. Исходные коды довольно большие, и я не вижу смысла в демпинге возможной бесполезной информации. Я бы скорее послал то, что будет иметь отношение к проблеме.
СпасибоНевозможно создать экземплярную активность для android.app.Activity

Первый звонок:

public class MainActivity extends Activity implements OnClickListener { 

} else if (v == backupDbButton){ 
    startActivity (new Intent(this, CheckSDDB.class)); 

Второй вызов:

public class CheckSDDB extends Activity { 

    Intent intent = new Intent(CheckSDDB.this,RunBackup.class); 
    startActivity(intent); 

Последний компонент:

public class RunBackup extends AsyncTask<Void, Void, Integer> { 

Вход:

02-21 15:14:15.067: E/AndroidRuntime(18123): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.peter.databasetest/com.peter.databasetest.RunBackup}: java.lang.ClassCastException: com.peter.databasetest.RunBackup cannot be cast to android.app.Activity 02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.os.Looper.loop(Looper.java:137) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.main(ActivityThread.java:4745) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at java.lang.reflect.Method.invokeNative(Native Method) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at java.lang.reflect.Method.invoke(Method.java:511) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at dalvik.system.NativeStart.main(Native Method) 
02-21 15:14:15.067: E/AndroidRuntime(18123): Caused by: java.lang.ClassCastException: com.peter.databasetest.RunBackup cannot be cast to android.app.Activity 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) 
02-21 15:14:15.067: E/AndroidRuntime(18123): ... 11 more 

Manifest (partial) 


<activity 
android:name="com.peter.databasetest.MainActivity" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 

<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
<activity 
android:name=".RunBackup" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.RUNBACKUP" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 
<activity 
android:name=".CheckSDDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.CHECKSDDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

@mike yaworski: Я изменил строку (это, CheckSDDB.class). Я не видел никаких изменений в исполнении. Спасибо за предложение в любом случае.

@DuZi Удалив Runbackup из манифеста, я получаю это. См. Журнал ниже.

02-24 07:39:43.745: E/AndroidRuntime(5069): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.peter.databasetest/com.peter.databasetest.CheckSDDB}: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.peter.databasetest/com.peter.databasetest.RunBackup}; have you declared this activity in your AndroidManifest.xml? 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.os.Looper.loop(Looper.java:137) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at dalvik.system.NativeStart.main(Native Method) 
02-24 07:39:43.745: E/AndroidRuntime(5069): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.peter.databasetest/com.peter.databasetest.RunBackup}; have you declared this activity in your AndroidManifest.xml? 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1541) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivityForResult(Activity.java:3351) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivityForResult(Activity.java:3312) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivity(Activity.java:3522) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivity(Activity.java:3490) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.peter.databasetest.CheckSDDB.onCreate(CheckSDDB.java:134) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.performCreate(Activity.java:5008) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2 023) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  ... 11 more 

Новый Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.peter.databasetest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
android:minSdkVersion="16" 
android:targetSdkVersion="19" /> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<supports-screens 
android:xlargeScreens="true" 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="false" /> 

<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" >   

<activity 
android:name="com.peter.databasetest.MainActivity" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 

<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 

<activity 
android:name="com.peter.databasetest.Insert" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.INSERT" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".ListDr" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.LISTDR" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".BackupDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.BACKUPDB" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".RestoreDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.RESTOREDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".InputValidation" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.INPUTVALIDATION" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".CheckSDDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.CHECKSDDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

</application> 
</manifest> 

@Atul O Holic: RunBackup просто копирует базу данных (данные/данные/...) до и SDcard. CheckSDDB проверяет наличие SD-карты независимо от того, является ли она доступной для записи, проверить наличие основной базы данных для копирования, а также проверяет, пуста ли база данных (таблица пуста). Как только условия ОК выполняются в CheckSDDB, вызывается startActyivity для RunBackup. RunBackup просто копирует БД на SDCard (вот почему мне нужна Asynctask), а затем возвращается в MainActivity. Поскольку я все еще изучаю Java, я не уверен, в какой Activity onCreate я должен разместить Asynctask.
Вот код RunBackup:

package com.peter.databasetest; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.channels.FileChannel; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Environment; 
import android.util.Log; 




    public class RunBackup extends AsyncTask<Void, Void, Integer> {  


     int bkcode;  
     String message; 
     public Context context; 
      protected Dialog alert; 

     public static String PACKAGE_NAME ; 
     public static String FOLDER_NAME = "DBfolder"; 
     public static final String DATABASE_NAME = "UserDB.db"; 
     public static final String DATABASE_BACKUP= "UserDB.db"; 
     public static final String TABLE_NAME = "tableone"; 
     public static final int DB_BACKUP_VERSION= 1; 
      //CHECKING DATABASE RELATED MESSAGES dbcode 

     public static final String NO_DB ="Database does not exist. Backup is not possible"; 
     public static final String EMPTY_DB ="Database is empty.\nNo backup was done."; 
     public static final String UNKN_ERR ="Unknown Error.\nNo backup was done."; 
            //CHECKING SDCARD RELATED MESSAGES sdcode 
     ////////////////////////////////////////////////////////////////////////////////////////////// 
     public static final String UNWR_SDCARD ="Your SDCard must be set to writable. Check the card lock"; 
     public static final String NO_SDCARD ="No SDcard detected. No backup is possible"; 
     /////////////////////////////////////////////////////////////////////////////////////////////// 
     //         BACKUP RELATED MESSAGES bkcode 
     ////////////////////////////////////////////////////////////////////////////////////////////// 
     public static final String BKP_OK = "Backup was SUCCESSFUL.- CheckSDDB";              // 00 
     public static final String FROM_FILE_NFOUND = "Input File not found. Backup not done";        //-15 
     public static final String TO_FILE_NFOUND = "Output File not found. Backup not done";        //-14 
     public static final String TO_FROM_COPY = "Problems Copying Input File to Output. Backup not done"; //-13 
     public static final String FROM_INPUT = "Problems Closing the Input File. Backup not done";      //-12 
     public static final String TO_OUTPUT = "Problems closing the Output File. Backup not done";     //-11 
     public static final String BKP_NOK = "Backup FAILED. "; 

     public static final String TAG = "runBackup"; 

    protected void onPreExecute() { 

    PACKAGE_NAME = context.getApplicationContext().getPackageName() ; 
    } 
     ////////////////////////////////////////////////////// 
     //    START BACKUP TO SDCARD 
     ////////////////////////////////////////////////////// 
    @Override 
    protected Integer doInBackground(Void... params) { 
     bkcode = 0; 
    File sd = Environment.getExternalStorageDirectory(); 
    File data = Environment.getDataDirectory(); 

    /////////////////////////////////////////////////////////////////////////////////////////// 
    //CREATE A FOLDER /mnt/sdcard<packagename>FOLDER_NAME if it does not exist 
    /////////////////////////////////////////////////////////////////////////////////////////// 
    File folder = new File(Environment.getExternalStorageDirectory() 
               + "/" 
               + PACKAGE_NAME 
               + "/" 
               + FOLDER_NAME); 

    if(!folder.exists()) { 
    if (folder.mkdirs()) ; 
    }         
    ////////////////////////////////////////////////////////////////////////// 
    //   GET THE PATH OF THE BACKUP ON THE SDCARD 
    ////////////////////////////////////////////////////////////////////////// 
    File fileBackupDir = new File(Environment.getExternalStorageDirectory() 
               + "/" 
               +PACKAGE_NAME 
               + "/" 
               + FOLDER_NAME 
               +"/" 
               + DATABASE_BACKUP) ; 
    /////////////////////////////////////////////////////////////////////////////////////////////// 
    // IF WE HAVE A BACKUP ON SDCARD, DELETE IT TO MAKE ROOM FOR THE NEW BACKUP 
    ////////////////////////////////////////////////////////////////////////////////////////////// 

    if (fileBackupDir.exists()) { 
    fileBackupDir.delete(); 
    }else { 
    /* DO NOTHING. THIS LOGIC KILLS ME... */ 
    } 
    ///////////////////////////////////////////////////////////// 
     //  GET CURRENT DB PATH FOR THE COPY 
     ///////////////////////////////////////////////////////////// 
    String currentDBPath = "/data/" + PACKAGE_NAME + "/databases/"+ DATABASE_NAME;   
     // GET CURRENT DB PATH FOR THE BACKUP   
     String backupDBPath = "/" + PACKAGE_NAME + "/" +FOLDER_NAME + "/" + DATABASE_BACKUP; 

    File currDB = new File(data, currentDBPath) ;   
    File bkpDB = new File(sd, backupDBPath); 

    FileChannel from = null; 

    try { 
    from = new FileInputStream(currDB).getChannel(); 
     } catch (FileNotFoundException e) { 
      bkcode = -15; 
      message = FROM_FILE_NFOUND ; 
      SendMessageDialog(message); 
     } 
     FileChannel to = null; 
     try { 
      to = new FileOutputStream(bkpDB).getChannel(); 
       } catch (FileNotFoundException e) { 
      bkcode = -14; 
      message = TO_FILE_NFOUND; 
      SendMessageDialog(message); 
     } 
    try { 

      to.transferFrom(from, 0, from.size()); 
     } catch (IOException e) { 
      bkcode = -13; 
      message = TO_FROM_COPY ; 
      SendMessageDialog(message); 
       } 
     try { 
      from.close(); 
     } catch (IOException e) { 
      bkcode = -12; 
      message = FROM_INPUT; 
      SendMessageDialog(message); 
     } 
     try { 
      to.close(); 
     } catch (IOException e) { 
      bkcode = -11; 
      message = TO_OUTPUT; 
      SendMessageDialog(message); 
      } 
     return bkcode; 
     } 
     protected void onPostExecute(Integer retcode, String message) { 

    if(retcode == 0) { 
        message = BKP_OK; 
        SendMessageDialog(message); 

       }else { 
        message = BKP_NOK; 
        SendMessageDialog(message); 
        } 
     } 
    /////////////////////////////////////////////////////////////////// 
    //      DISPLAY MESSAGES 
    ////////////////////////////////////////////////////////////////// 
      public void SendMessageDialog(String message) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       if (bkcode == 0) { 
        builder.setIcon(R.drawable.ecg);      /* SET OK ICON */ 
       }else { 
        builder.setIcon(R.drawable.bad);  
       } 
        builder.setTitle("My MESSAGE") 
        .setMessage(message)        // Title of the dialog 
        .setCancelable(true)        // allow the use of Back Button on the hardware 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          returnMain(); 
    }     
      ); 
        alert = builder.create(); 
        alert.show();  
    }    

      /////////////////////////////////////////////////////////////////// 
      //    BACK TO THE CALLING ACTIVITY 
      /////////////////////////////////////////////////////////////////// 
      public void returnMain() { 
       if (alert != null && alert.isShowing()) { 
        alert.dismiss(); 
       } 
       Context ctx = context.getApplicationContext(); 
       Intent intent = new Intent(ctx, MainActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       ctx.startActivity(intent); 

      } 
} 

@NPE: Спасибо за ссылку. Я уже много раз объяснял объяснение, но я все еще не понимаю, почему RunBackup не может работать в соответствии с приведенным выше журналом на основе объяснения, приведенного в ссылке.

+0

Почему ваш класс Runbackup является активным в вашем манифесте, когда он явно расширяет класс AsnycTask? – ezcoding

ответ

1

Это еще не все решение (не знаете, в чем проблема с RunBackup), но это может быть что-то заслуживающее внимания.

} else if (v == backupDbButton){ 
    startActivity (new Intent(this, CheckSDDB.class)); 

Я предполагаю, что это называется в onClick или каким-либо другим способом, где v является View. Проблема заключается в том, что this относится к этому View (насколько мне известно).

Попытка изменения этого:

startActivity (new Intent(this, CheckSDDB.class)); 

К этому:

startActivity (new Intent(MainActivity.this, CheckSDDB.class)); 
0

намерение является абстрактным описание операции должны быть выполнены. Он может использоваться с startActivity для запуска Activity, broadcastIntent для отправки его любым заинтересованным компонентам BroadcastReceiver и startService (Intent) или bindService (Intent, ServiceConnection, int) для связи с фоновым сервисом.

Если вы хотите начать RunBackup с Intent, то вам нужно расширить Activity класса или любого из его подклассов.

Дополнительная информация here.

0

Проблема заключается в строке ниже

Intent intent = new Intent(CheckSDDB.this,RunBackup.class); 

RunBackup является подклассом из AsyncTask и ваш умысел ожидает активность. Отсюда и исключения. Поэтому, как сказал @NPE создать новую активность которого вы звоните, делая,

Intent intent = new Intent(CheckSDDB.this,NewActivty.class); 
startActivity(intent); 

и место, куда вы AsyncTask вызов в его методе OnCreate(). Так что, как только действие будет создано, ваш RunBackUp будет запущен.

И если вы также можете объяснить, что вы собираетесь делать с вашей Asynctask, это облегчит нам помощь.

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