【问题标题】:ClassCastException in android databaseandroid数据库中的ClassCastException
【发布时间】:2014-04-07 07:17:35
【问题描述】:

我有一个MainActivity,其onCreate

//called when activity first created
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    searchText = (EditText) findViewById(R.id.searchText);
    utils = new Utils(MainActivity.this);
    db=(new SQLLiteDbHelper(MainActivity.this,utils.getInt(Key.Db_version))).getReadableDatabase(); 
    request = new WebRequest(this);
    status = new AsynGetEmployeeStatus();

}

sqlitehelper onCreateconstructor

//constructor 
public SQLLiteDbHelper(Context context,int dbVersion) {
    super(context,DATABASE_NAME, null, dbVersion);
    this.context = context;
    Log.d("tag","db version is "+DATABASE_VERSION);
    crypt = new Cryptography();
    utils = new Utils(context);
}



//called when activity first created
@Override
public void onCreate(final SQLiteDatabase db) {
    String s;

    try {

        //new LoadData().execute(db);   

        new AsynNetworkOperation(context, ServiceUri.AccessMethod.GET, "loading").execute(ServiceUri.SERVICE_URI+"s?d=abc");  //this line throw exception


    } catch (Throwable t) {
        Toast.makeText(context, t.toString(), Toast.LENGTH_LONG).show();
        Log.d("tag",t.toString());
    }
}

我的AsynNetworkOperation 班级是

public class AsynNetworkOperation extends AsyncTask<String,Void,Void>{

private Context context = null;
private ProgressDialog dialog = null;
private String title = "";
private WebRequest request = null;
private String accessMethod = "";
private HttpResponse response = null;
AsynResponse delegate = null;

public AsynNetworkOperation(Context context, String method, String dialogTitle)
{
    this.context = context;
    accessMethod = method;
    this.title = dialogTitle;
    delegate = (AsynResponse) context;
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    dialog = new ProgressDialog(context);
    dialog.setMessage(title);
    dialog.setCanceledOnTouchOutside(false);
    dialog.show();
}

@Override
protected Void doInBackground(String... data) {
    // TODO Auto-generated method stub
    request = new WebRequest(context);
    if(accessMethod.equals(ServiceUri.AccessMethod.GET)){
        response = request.makeHttpGetCall(data[0]);
    }
    return null;
}

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    dialog.dismiss();
    delegate.responseResult(response);
    dispose();
}

private void dispose()
{
    context = null;
    dialog = null;
    title = "";
    request = null;
    accessMethod = "";
    delegate = null;
}

}

AsynResponse

public interface AsynResponse {

/**
 * This will called when AysncTask finished its execution or when onPostExecute called
 * 
 * @param response
 */
public void responseResult(HttpResponse response);

}

我的问题是,每当 sqlitehelper 尝试在其 onCreate 中执行新的 AsynNetworkOperation 时,它都会抛出异常

java.lang.ClassCastException: android.app.MainActivity

谁能帮我找出为什么它抛出异常的问题。

谢谢

【问题讨论】:

  • 发布 AsynNetworkOperation
  • 对不起..我想我有问题。我忘了实现接口。
  • 这行delegate = (AsynResponse) context; 可能导致问题
  • @wqrahd : 如果您遇到任何问题,请尝试在 sqlite helper 类中实现它,然后我们会尽力帮助您
  • @wqrahd :向 AsynNetworkOperation 构造函数添加一个参数为AsynNetworkOperation(SQLLiteDbHelper sqlitehelper,Context context, String method, String dialogTitle),然后使用delegate =sqlitehelper; 并从 SQLLiteDbHelper new AsynNetworkOperation(this,context, ServiceUri.AccessMethod.GET, "loading").execute(ServiceUri.SERVICE_URI+"s?d=abc"); 执行任务,如果您在AsynResponse 中实现AsynResponse

标签: java android sqlite android-asynctask android-sqlite


【解决方案1】:

这看起来可能是问题所在:

delegate = (AsynResponse) context;

您将context 变量转换为AsynResponse,而context 变量来自这里:

new SQLLiteDbHelper(MainActivity.this, ...)

所以它不是AsynResponse。甚至不清楚AsynResponse 是什么,但MainActivity 大概与它不兼容。

您应该确定您真正希望该值是什么,并可能将其单独传递给Context

【讨论】:

  • 感谢您的回答。是的,这就是问题所在。但是我应该在哪里实现接口。指 Sqlitehelper 类或 mainactivity 类。
  • @wqrahd:好吧,您将MainActivity 对象转换为AsynResponse,所以可能在那里 - 但我们对您的身份了解不够试图实现甚至界面所代表的内容。
  • 我想在 sqlite helper 类上实现接口。我应该怎么做。我正在编辑我的问题并发布 Asynresponse 界面。
  • 编辑了我的问题。我创建了这个界面来在 asyntask 完成执行时通知我。所以我想在 asyntask 完成(在 sqlite 助手类中)它的执行时执行,然后我需要填充我的数据库,但我想在 sqlite 助手类中执行此操作而不是在 mainactivity 中。
  • 如何在 sqlitehelper 而不是 mainactivity 上实现这个?
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多