Android 从sqlite检索数据并预览它
当我按下按钮时,我会启动一个新的活动Android 从sqlite检索数据并预览它,android,sqlite,Android,Sqlite,当我按下按钮时,我会启动一个新的活动myActivity。我希望myActivity的布局能够预览从myDataBase检索到的一些数据,但是当我更改TextView的文本时,程序崩溃了,下面是我的代码 public class myActivity extends Activity { TextView tv1; myDataBase DB; String s; String reqName @Override protected void onCreate(Bundle savedInst
myActivity
。我希望myActivity
的布局能够预览从myDataBase
检索到的一些数据,但是当我更改TextView
的文本时,程序崩溃了,下面是我的代码
public class myActivity extends Activity {
TextView tv1;
myDataBase DB;
String s;
String reqName
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.information);
tv1 = (TextView)findViewById(R.id.testtest);
Bundle bundle = getIntent().getExtras();
reqName = bundle.getString("someKey");
DB = new myDataBase(this);
new GetSomeData().execute(reqName);
}
public class GetSomeData extends AsyncTask<String,Integer ,String>
{
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
try
{
String name = reqName;
DB.open();
s = DB.getData(name);
DB.close();
}
catch(Exception e)
{
e.printStackTrace();
}
tv1.setText(s); // this line makes the program crash
return s;
}
}}
公共类myActivity扩展活动{
文本视图tv1;
数据库数据库;
字符串s;
字符串名称
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.information);
tv1=(TextView)findViewById(R.id.testtest);
Bundle Bundle=getIntent().getExtras();
reqName=bundle.getString(“someKey”);
DB=新的myDataBase(此数据库);
新建GetSomeData().execute(reqName);
}
公共类GetSomeData扩展异步任务
{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
尝试
{
字符串名称=请求名称;
DB.open();
s=DB.getData(名称);
DB.close();
}
捕获(例外e)
{
e、 printStackTrace();
}
tv1.setText(s);//此行使程序崩溃
返回s;
}
}}
我认为程序崩溃是因为交叉线程(我不确定!),
我怎样才能解决这个问题?有没有更好的方法来预览数据库中的数据?不允许从后台线程修改UI元素。
AsyncTasks
的doInBackground()
方法在后台线程中运行,因此会出现错误
相反,将要设置为TextView
的String
从doInBackground()
方法返回到onPostExecute()
方法,然后将该String
设置到TextView
方法。这是可行的,因为onPostExecute()
在主线程中运行,也称为“UI线程”
公共类GetSomeData扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
试一试{
字符串名称=请求名称;
DB.open();
s=DB.getData(名称);
DB.close();
}捕获(例外e){
e、 printStackTrace();
}
返回s;
}
@凌驾
受保护的void onPostExecute(字符串s){
tv1.setText(s);
}
}
AsyncTask的doInBackground()方法中无法创建任何UI非常感谢,,,我以前在c中通过this.invoke()方法解决了这个问题
public class GetSomeData extends AsyncTask<String,Integer ,String> {
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
try {
String name = reqName;
DB.open();
s = DB.getData(name);
DB.close();
} catch(Exception e) {
e.printStackTrace();
}
return s;
}
@Override
protected void onPostExecute (String s) {
tv1.setText(s);
}
}