Java Android创建了一个单独的线程,该线程涉及视图错误

Java Android创建了一个单独的线程,该线程涉及视图错误,java,android,multithreading,view,Java,Android,Multithreading,View,所以我理解这个错误。我试图用一个不是主UI线程的线程来调整UI。但这本身就是问题所在。进行图像处理(在本例中,灰度缩放多个位图)是一项CPU密集型任务。因此,我是否应该尝试启动一个处理图像处理的线程?或者我的想法仅仅是一个理想的想法,因为我收到的错误而根本不可能实现?有没有我不知道的工作 实际错误消息: android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图 //Package declara

所以我理解这个错误。我试图用一个不是主UI线程的线程来调整UI。但这本身就是问题所在。进行图像处理(在本例中,灰度缩放多个位图)是一项CPU密集型任务。因此,我是否应该尝试启动一个处理图像处理的线程?或者我的想法仅仅是一个理想的想法,因为我收到的错误而根本不可能实现?有没有我不知道的工作

实际错误消息: android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图

//Package declaration
//Many import statements

public class PhotoViewer extends Activity implements OnClickListener {

private Button refresh_;
private Button grey_;

private ImageView image1_;
private ImageView image2_;
private ImageView image3_;
private ImageView image4_;

private GreyBitmaps gMap_;

private Bitmap bMap1_;
private Bitmap bMap2_;
private Bitmap bMap3_;
private Bitmap bMap4_;

private int num_;
private boolean makeGrey_;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_photos);

    // this GreyBitmaps class creates the other thread
    gMap_ = new GreyBitmaps();

    refresh_ = (Button) findViewById(R.id.refresh);
    grey_ = (Button) findViewById(R.id.grey);

    image1_ = (ImageView) findViewById(R.id.view1);
    image2_ = (ImageView) findViewById(R.id.view2);
    image3_ = (ImageView) findViewById(R.id.view3);
    image4_ = (ImageView) findViewById(R.id.view4);

    refresh_.setOnClickListener(this);
    grey_.setOnClickListener(this);

    makeGrey_ = false;
    getPhotos();
    setBitmap();
    //num_ =0;
}


public void onClick(View v) {
    Log.d("onClick", "Begin");
    if(v == refresh_){
        refreshPhoto();
    }else if (v == grey_){
        greyPhoto();
    }
    Log.d("onClick", "end");
}

protected void onResume(){
    super.onResume();
    gMap_.resume();

}
protected void onPause(){
    super.onPause();
    gMap_.pause();
}

private void refreshPhoto(){
    getPhotos();
}

private void greyPhoto(){
    makeGrey_ = true;
}

private void getPhotos(){
    bMap1_ = BitmapFactory.decodeResource(getResources(), R.drawable.p1);
    bMap2_ = BitmapFactory.decodeResource(getResources(), R.drawable.p2);
    bMap3_ = BitmapFactory.decodeResource(getResources(), R.drawable.p3);
    bMap4_ = BitmapFactory.decodeResource(getResources(), R.drawable.p4);
}

private void setBitmap(){
    image1_.setImageBitmap(bMap1_);
    image2_.setImageBitmap(bMap2_);
    image3_.setImageBitmap(bMap3_);
    image4_.setImageBitmap(bMap4_);
}

private Bitmap goGrey(Bitmap bmIn){
    final double gs_red = 0.299;
    final double gs_green = 0.587;
    final double gs_blue = 0.114;

    int width = bmIn.getWidth();
    int height = bmIn.getHeight();

    Bitmap bmOut = Bitmap.createBitmap(width, height, bmIn.getConfig());
    int a, r, g, b;
    int pix;

    for(int x = 0; x<width; x++){
        for(int y = 0; y<height; y++){
            pix = bmIn.getPixel(x, y);
            a = Color.alpha(pix);
            r = Color.red(pix);
            g = Color.green(pix);
            b = Color.blue(pix);
            r = g = b = (int) (gs_blue*b +gs_green*g +gs_red*r);

            //write out
            bmOut.setPixel(x, y, Color.argb(a, r, g, b));
        }
    }
    return bmOut;
}

public class GreyBitmaps implements Runnable{
    Thread t = null;
    boolean isActive = false;

    public void run() {
        Log.d("Runnable", "running");
        //num_ = 100;
        while(isActive) {
            Log.d("Runnable", "running2");
            num_ = 200;
            setBitmap();
            try {
                Thread.sleep(100);
                if (makeGrey_) {
                    goGrey(bMap1_);
                    goGrey(bMap2_);
                    goGrey(bMap3_);
                    goGrey(bMap4_);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void pause(){
        isActive = false;
        while(true){
            try{
                t.join();
            }catch (InterruptedException e) {
                e.printStackTrace();
                Log.e("Error", "Failed to join thread");
            }
            break;
        }
        t = null;

    }

    public void resume(){
        isActive = true;
        t = new Thread(this);
        t.start();
    }
}
//包声明
//许多进口声明
公共类PhotoViewer扩展活动实现OnClickListener{
私人按钮刷新;
私人按钮灰色;
私有图像查看图像1;
私有图像查看图像2;
私有图像查看图像3;
私有图像查看图像4;
私人灰度地图;
私有位图bMap1;
私有位图bMap2;
私有位图bMap3;
私有位图bMap4;
私有整数;
私有布尔makeGrey;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_照片);
//这个GreyBitmaps类创建另一个线程
gMap_u2;=新的灰色位图();
刷新(按钮)findViewById(R.id.refresh);
灰色=(按钮)findViewById(R.id.grey);
image1_=(ImageView)findViewById(R.id.view1);
image2_=(ImageView)findViewById(R.id.view2);
image3_=(ImageView)findViewById(R.id.view3);
image4_=(ImageView)findViewById(R.id.view4);
刷新.setOnClickListener(此);
grey_uu.setOnClickListener(此);
makeGrey=false;
获取照片();
setBitmap();
//num=0;
}
公共void onClick(视图v){
Log.d(“onClick”、“Begin”);
如果(v==刷新){
刷新照片();
}else if(v==灰色){
灰色照片();
}
Log.d(“onClick”、“end”);
}
受保护的void onResume(){
super.onResume();
gMap_uuz.resume();
}
受保护的void onPause(){
super.onPause();
gMap_uu1;pause();
}
私人照片(){
获取照片();
}
私有void greyPhoto(){
使灰色=真;
}
私人照片{
bMap1=位图工厂.decodeResource(getResources(),R.drawable.p1);
bMap2=位图工厂.decodeResource(getResources(),R.drawable.p2);
bMap3=位图工厂.decodeResource(getResources(),R.drawable.p3);
bMap4=位图工厂.decodeResource(getResources(),R.drawable.p4);
}
私有void setBitmap(){
设置图像位图(bMap1);
设置图像位图(bMap2);
设置图像位图(bMap3);
设置图像位图(bMap4);
}
专用位图goGrey(位图bmIn){
最终双gs_红=0.299;
最终双gs_绿=0.587;
最终双gs_蓝=0.114;
int width=bmIn.getWidth();
int height=bmIn.getHeight();
位图bmOut=Bitmap.createBitmap(宽度、高度、bmIn.getConfig());
int a,r,g,b;
int-pix;
对于(int x=0;x调用
runOnUiThread
线程中的
setBitmap()
方法


请参阅此链接以了解
runOnUiThread
方法实施

此实施有效,谢谢!