Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从sqlite检索数据并预览它_Android_Sqlite - Fatal编程技术网

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);
   }
}