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".