废话少说,具体代码示例如下:
LayoutInflater mInflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = mInflater.inflate(R.layout.recordlayout, null);
view.setMinimumHeight(200);
view.setMinimumWidth(500);
LinearLayout layout = (LinearLayout) view
.findViewById(R.id.id_recordlayout);
这几天在开发AppWidget时遇到一个奇怪问题:AppWidget上有一个时钟,使用TIME_TICK每分钟更新一次时间,问题是在长时间待机后出现,AppWidget上的时间不能与系统时间同步(ERROR/JavaBinder(1847): !!! FAILED BINDER TRANSACTION !!!)。
通过AIDL通信机制的流程找到这个Log出现在android_os_Binder.cpp文件中android_os_BinderProxy_transact函数内部,原本是一个OutOfMemoryError,这是AIDL Client端访问时传递的Parcelable包过大而引起的错误,而RemoteViews就是一个实现了Parcelable接口的类,它作为AppWidget视图组件传递的数据结构通过AIDL在AppWidget应用向Launcher传递。
产生这个问题的原因主要在于,RemoteViews的set系列函数在其内部会转换成Action对象存放在在ArrayList<Action>中,而在RemoteViews中没有对这个ArrayList<Action>进行清理的操作。而由于更新频率比较高在设计这个应用时把updateAppWidget()操作放在了Service中,并且每次都在重复使用这个RemoteViews对象,这就造成RemoteViews中的ArrayList<Action>中的数据越来越大,造成内存溢出错误。
所以每个RemoteViews对象最好不要重复使用
转载:http://hi.baidu.com/tigerpan/blog/item/26305963df32f949ebf8f843.html
public class MyProvider extends ContentProvider {
final static String TABLE_NAME = "test";
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
// TODO Auto-generated method stub
//Cursor cur = mdbHelper.getWritableDatabase().rawQuery("select * from todo_table", null);
ToDoDB mdbHelper;
//Cursor cur2 = mdbHelper.test();
//return cur2;
//////////////////////////////////////
String content;
try {
/*
File file= new File("/sdcard/qq.txt");
FileInputStream in = new FileInputStream(file);
int length = (int) file.length();
byte[] buffer = new byte[length];
in.read(buffer, 0, length);
content = EncodingUtils.getString(buffer, "UTF-8");
in.close();*/
String[] columns = new String[] { "MyUser.User._ID", "MyUser.User.USER_NAME" };
MatrixCursor cur = new MatrixCursor(columns);
String[] values = new String[] { "0", "content" };
cur.moveToFirst();
cur.addRow(values);
return cur;
} catch (Exception e) {
return null;
}
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
return 0;
}
}