Viewroot вызван из неправильной темы исключения

Я хочу вызывать функцию p() через регулярные промежутки времени, для этого я использовал метод scheduleatfixedrate. Когда я запускаю код, я получаю "Viewroot Called From Wrong Thread Exception", как видно из журнала. Я добавил реализацию onuithread к вызову функции, чтобы решить эту проблему, но она бесполезна.

package com.example.flipper;

import java.io.IOException;

import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


import android.os.Bundle;
import android.app.Activity;
import android.app.WallpaperManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewFlipper;

public class MainActivity extends Activity {

    Button n,p,apply;
    ImageView ivmain;
    int imageId;
    int i = 0;
    TimerTask tt;
    Timer t = new Timer();
    TextView t1;
    View v;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        n = (Button)findViewById(R.id.button1);
        p = (Button)findViewById(R.id.button2);
        apply = (Button)findViewById(R.id.button3);
        ivmain = (ImageView)findViewById(R.id.imageView1);
        ivmain.setImageResource(R.drawable.bangalorelogo);
        t1 = (TextView)findViewById(R.id.textView1);
        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                p();
            }




        });


}

public void p ()

    {
        tt = new TimerTask(){
            public void run()
            {

        Random r = new Random();
        i = r.nextInt(3);
        switch(i)
        {
        case 0:
            ivmain.setImageResource(R.drawable.chennailogo);
            break;
        case 1:
            ivmain.setImageResource(R.drawable.ic_launcher);
            break;
        case 2:
            ivmain.setImageResource(R.drawable.cscaptain);
            break;
        case 3:
            ivmain.setImageResource(R.drawable.chennailogo1);
        default:
            ivmain.setImageResource(R.drawable.ic_launcher);
            break;

        }
        t1.setText(""+i);

            }
        };
        t.scheduleAtFixedRate(tt, 2000, 1000);
    }

1 ответ

Ваш метод p() выполняется в потоке пользовательского интерфейса. Тем не менее, ваш таймер "t" имеет свой собственный поток, поэтому TimerTask "tt" не выполняется в потоке пользовательского интерфейса; он выполняется в потоке TimerTask. Чтобы решить эту проблему, вы можете запустить p() из потока пользовательского интерфейса и заставить TimerTask tt выполнить Runnable, который выполняется в потоке пользовательского интерфейса:

tt = new TimerTask(){
            public void run()
            {new Runnable() { runOnUiThread(touchViews); } } }

Затем поместите всю свою логику и манипуляции с представлениями в Runnable "touchViews".

Другие вопросы по тегам