РЕДАКТИРОВАТЬ: После изменения метода onPostExecute () задачи GetData на вызов только cursor.requery () он, кажется, работает.
Я создаю операцию Android, которая извлекает данные из веб-службы с использованием библиотеки kSoap. Данные хранятся в базе данных sqlite и отображаются с помощью пользовательского адаптера CursorAdister. Код работает для обновления базы данных, и он отображает список так, как я хочу, с данными из базы данных.
Однако я хочу, чтобы действие проверяло, устарела ли база данных в onCreate, и устарело ли, обновите базу данных и затем установите адаптер. Для этого я настроил AsyncTask, который обновляет базу данных в фоновом потоке и устанавливает CursorAdapter в onPostExecute. Если я пытаюсь использовать свой собственный CursorAdapter, есть исключение. Но если я вместо этого использую стандартный BasicCursorAdapter (с любым из столбцов курсора в качестве данных), он работает нормально. Опять же, пользовательский CursorAdapter работает нормально, когда я не обновляю базу данных.
Я пытался выяснить, что может вызвать это исключение, но у меня закончились идеи. Возможно, есть проблема с записью в базу данных и последующим чтением из нее?
Вот активность:
public class MyList extends ListActivity {
private MyDBAdapter db;
private Cursor cursor;
private MyWebService wsData;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_list);
context = this;
wsData = new MyWebService();
db = new MyDBAdapter(this);
db.open();
//EDIT: I get the cursor and sets the adapter in onCreate instead of in the GetDataTask
cursor = db.getAll();
startManagingCursor(cursor);
ListAdapter adapter = new MyListAdapter(context,
R.layout.my_list_row,
cursor,
new String[] { cursor.getColumnName(1) },
new int[] { R.id.myListRow_id });
setListAdapter(adapter);
//If (dbIsOutdated()) {
new GetDataTask().execute();
//} else {
//setAdapter();
//}
}
@Override
protected void onDestroy() {
super.onDestroy();
db.close();
}
Это задание:
private class GetDataTask extends AsyncTask<Void, Void, Boolean> {
private final ProgressDialog dialog = new ProgressDialog(context);
protected void onPreExecute() {
this.dialog.setMessage("Downloading data...");
this.dialog.show();
}
protected Boolean doInBackground(Void...voids) {
//First get a soapobject with all the leagues
SoapObject unparsed = wsData.getAll();
//Clear all old data in the database
db.clearTables();
//Iterate through the soapobject and fill the database
for (int i=0;i<unparsed.getPropertyCount();i++) {
if (unparsed.getProperty(i) instanceof SoapObject) {
String id = ((SoapObject)unparsed.getProperty(i)).getProperty("Id").toString();
String name = ((SoapObject)unparsed.getProperty(i)).getProperty("Name").toString();
db.insert(id, name);
}
}
return true;
}
protected void onPostExecute(Boolean unused) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
//this updates the list
cursor.requery();
/* --- This part is not necessary it seems, and might be what
--- causes the memory overloading
cursor = db.getAll();
startManagingCursor(cursor);
ListAdapter adapter = new MyListAdapter(context,
R.layout.my_list_row,
cursor,
new String[] { cursor.getColumnName(1) },
new int[] { R.id.myListRow_id });
setListAdapter(adapter);
*/
}
}
MyWebService - это класс, который обрабатывает вызовы WebService, а метод getAll () возвращает объект SoapObject, содержащий объекты SoapObject с соответствующими данными.
У меня также есть метод (setAdapter ()), который устанавливает адаптер точно так же, как onPostExecute (), и это работает без проблем.
Мой адаптер:
public class MyListAdapter extends SimpleCursorAdapter {
private Cursor mCursor;
private Context mContext;
public MyListAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.mCursor = c;
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row==null){
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.my_list_row, parent, false);
}
this.mCursor.moveToPosition(position);
TextView id=(TextView)row.findViewById(R.id.leagueListRow_id);
TextView name=(TextView)row.findViewById(R.id.leagueListRow_name);
String lId = this.mCursor.getString(1);
String lName = this.mCursor.getString(2);
id.setText(lId);
name.setText(lName);
return row;
}
}
Я не уверен, как читать журнал, но я предполагаю, что эти строки являются критическими:
[snip]
02-10 19:18:10.446: DEBUG/dalvikvm(223): GC freed 20592 objects / 1063064 bytes in 546ms
02-10 19:18:17.256: INFO/ARMAssembler(59): generated scanline__00000177:03515104_00001001_00000000 [ 91 ipp] (114 ins) at [0x2fa530:0x2fa6f8] in 10766582 ns
02-10 19:18:17.377: ERROR/dalvikvm-heap(223): 256-byte external allocation too large for this process.
02-10 19:18:17.396: ERROR/(223): VM won't let us allocate 256 bytes
02-10 19:18:17.407: DEBUG/skia(223): --- decoder->decode returned false
02-10 19:18:17.419: DEBUG/AndroidRuntime(223): Shutting down VM
02-10 19:18:17.419: WARN/dalvikvm(223): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
02-10 19:18:17.427: ERROR/AndroidRuntime(223): Uncaught handler: thread main exiting due to uncaught exception
02-10 19:18:17.489: ERROR/AndroidRuntime(223): android.view.InflateException: Binary XML file line #20: Error inflating class <unknown>
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.createView(LayoutInflater.java:513)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at se.gobrugda.bbmanagerdroid.ListLeaguesNew$LeagueListAdapter.getView(ListLeaguesNew.java:224)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.AbsListView.obtainView(AbsListView.java:1274)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.ListView.measureHeightOfChildren(ListView.java:1147)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.ListView.onMeasure(ListView.java:1060)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.View.measure(View.java:7964)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.View.measure(View.java:7964)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.View.measure(View.java:7964)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.View.measure(View.java:7964)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.View.measure(View.java:7964)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.os.Handler.dispatchMessage(Handler.java:99)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.os.Looper.loop(Looper.java:123)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at java.lang.reflect.Method.invokeNative(Native Method)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at java.lang.reflect.Method.invoke(Method.java:521)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at dalvik.system.NativeStart.main(Native Method)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): Caused by: java.lang.reflect.InvocationTargetException
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.ImageView.<init>(ImageView.java:105)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at java.lang.reflect.Constructor.constructNative(Native Method)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.view.LayoutInflater.createView(LayoutInflater.java:500)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): ... 35 more
02-10 19:18:17.489: ERROR/AndroidRuntime(223): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:447)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.content.res.Resources.loadDrawable(Resources.java:1705)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): at android.widget.ImageView.<init>(ImageView.java:115)
02-10 19:18:17.489: ERROR/AndroidRuntime(223): ... 39 more
02-10 19:18:17.556: INFO/Process(59): Sending signal. PID: 223 SIG: 3
02-10 19:18:17.556: INFO/dalvikvm(223): threadid=7: reacting to signal 3
02-10 19:18:17.636: INFO/dalvikvm(223): Wrote stack trace to '/data/anr/traces.txt