#android #class #textview
#Android #класс #textview
Вопрос:
У меня есть класс с именем Main, который расширяет Activity. В этом классе я определил другой класс, который расширяет thread . Я хочу установить текст в TextView из метода класса MyThread. Я отладил свою программу, но когда я хочу установить текст в textview, он говорит, что источник не найден.
Вот мой код. Я надеюсь, вы лучше поймете, что я хочу объяснить.
Это происходит, когда я нажимаю кнопку. Это из моей функции onCreate в основном классе.
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
pd = ProgressDialog.show(Main.this, "", "Downloading Data...", true, false);
MyThread mThread = new MyThread();
mThread.start();
}
});
Это класс MyThread.
class MyThread extends Thread {
@Override
public void run(){
String result=Main.this.parse();
TextView tv=(TextView) findViewById(R.id.textView5);
tv.setText(result);
Main.this.pd.dismiss();
}
}
Результирующая строка — это строка, которая повторно возвращается функцией, определенной в моем основном классе. Я проверил, и результат в порядке. Программа останавливается, когда я дохожу до строки
tv.setText(result);
Странно то, что в нем нет ошибок в строке
TextView tv=(TextView) findViewById(R.id.textView5);
Спасибо за любую помощь! : D
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
tv=(TextView) findViewById(R.id.textView5);
Button b=(Button) findViewById(R.id.button1);
final EditText et1=(EditText) findViewById(R.id.editText1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
pd = ProgressDialog.show(Main.this, "", "Downloading Data...", true, false);
Log.d("asinc","inainte d downloadtask");
// Start a new thread that will download all the data
MyThread mThread = new MyThread();
mThread.start();
//parse();
}
});
Ответ №1:
Может быть, я что-то пропустил, но почему вы получаете доступ к компонентам пользовательского интерфейса из неосновного потока? Насколько я понимаю, пользовательский интерфейс не является потокобезопасным; и поэтому я бы предложил использовать AsyncTask вместо Thread . В этом случае вы можете поместить свой основной код обработки в метод doInBackground, а весь доступ к компоненту пользовательского интерфейса — в onPostExecute (onPostExecute вызывается из основного потока после завершения выполнения задачи).
Комментарии:
1. Я попробую с помощью AsyncTask и сообщу вам, удалось ли мне решить проблему.
Ответ №2:
попробуйте установить в своем основном классе onCreate()
private TextView tv; //declare as global so you can used into the subclass or into the methods
onCreate(){
tv=(TextView) findViewById(R.id.textView5);
}
а затем используется в потоке
Комментарии:
1. код довольно большой. Я постараюсь показать вам те части, которые представляют интерес.
2. <?xml version=»1.0″ encoding=»utf-8″?> <RelativeLayout xmlns:android=» schemas.android.com/apk/res/android » android:layout_width=»fill_parent» android:layout_height=»fill_parent» android:orientation=»vertical» android:background=»@drawable/earth2medium»> <TextView android:id=»@ id/textView5″ android:text=»» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android:textColor=»#FFFFFF» android:textSize=»15sp» android:layout_alignTop=»@ id/button3″ android:layout_alignParentLeft=»true» />
3. TextView находится в том же файле макета.
4. Спасибо за вашу помощь! Мне удалось решить проблему, используя AsyncTask вместо Thread