0

当我按下它时,我有一个按钮,我开始一个新的活动myActivitymyActivity我想要预览从中检索到的一些数据的布局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;

}   
}}

我认为程序崩溃是因为跨线程(我不确定!),我该如何解决这个问题?预览数据库中的数据有更好的主意吗?

4

1 回答 1

1

不允许从后台线程修改 UI 元素。AnAsyncTasksdoInBackground()方法在后台线程中运行,这就是您收到错误的原因。

相反,将String您希望设置为TextView从您的doInBackground()方法返回到该onPostExecute()方法,然后将其设置String为您的TextView那里。这是可行的,因为onPostExecute()在主线程中运行,也称为“UI 线程”。

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);
   }
}
于 2012-06-15T13:52:53.033 回答