0

押すとボタンがあり、新しいアクティビティを開始しmyActivityます。myActivityから取得したデータをのレイアウトでプレビューしたいのですが、プログラム crashmyDataBaseのテキストを変更すると、次のコードが表示されます。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要素を変更することは許可されていません。のメソッドはバックグラウンドスレッドAsyncTasksdoInBackground()実行されるため、エラーが発生します。

代わりに、String設定したいをメソッドからメソッドTextViewに戻し、それをそこに設定します。これは、「UIスレッド」とも呼ばれるメインスレッドで実行されるため、機能します。doInBackground()onPostExecute()StringTextViewonPostExecute()

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 に答える