Распознать textview в другом классе, определенном в том же упражнении — Android

#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