如何控制处理程序的控制权?

时间:2020-04-11 19:32:58

标签: android multithreading thread-safety handler android-handler

我有三种布局,其中包含“图像视图”。当我按下开始按钮时,图像视图开始逐个更改其图像资源,直到6。例如,如果按两次开始按钮,则两个图像将更改其图像资源。另外,如果我按图像视图,则应该停止更改图像的过程,这部分我有问题。 我写了下一个代码:

startButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                final int index[];
                index = getindex();
                Runnable run = new Runnable() {
                    @Override
                    public void run() {
                        Log.d(tag, "New runnable: on " + index[0] + " " + index [1]);
                        displayFlags(index[0],index[1]);
                    }
                };
                handler.post(run);
            }
        });

然后,当我按下开始按钮时,我正在为图像视图创建可运行对象。方法getIndex()用于获取linearLayout中imageView的索引。另外,我为displayFlags方法编写了下一个:

private void displayFlags(int pRow, int pColumn) {
final int row = pRow;
final int column = pColumn;

final ArrayList<Drawable> drawablesList = new ArrayList<>();


//Here is basically for get an image resources.
AssetManager assets = getAssets();
        for (int i = 0; i < 6; i ++) {
                String nextImage = countriesList.remove(0);
                String region = nextImage.substring(0, nextImage.indexOf('-'));
                try (InputStream stream =
                             assets.open(region + "/" + nextImage + ".png")) {
                    drawablesList.add( Drawable.createFromStream(stream, nextImage));
                }
                catch (IOException exception) {
                    Log.e(tag, "Error loading " + nextImage, exception);
                }
            }
//here I have problems, I think
Runnable runnable = new Runnable() {
    int i = 0;
    ImageView imageView =  (ImageView) rowsLinearLayouts[row].getChildAt(column);

    public void run() {
        if(startButtonState == false) {
            Log.d(tag, "New runnable On: " + row + " " + column );
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageDrawable(drawablesList.get(i));
            i++;
            handler.postDelayed(this, 1000);
            if (i == 6) {
                imageView.setVisibility(View.INVISIBLE);
                handler.removeCallbacks(this);
                if(requestsExceeded == true){
                    requestsExceeded = false;
                    startButton.setEnabled(true);
                }
            }
        } else if (startButtonState == true){
            Log.d(tag, "Delete runnable on: " + row + " " + column);
            handler.removeCallbacks(this);
            imageView.setVisibility(View.INVISIBLE);
            startButtonState = false;
            startButton.setEnabled(true);
            requestsExceeded = false;

        }
    }
};

startButtonState是用于取消可运行项的标志。当我按图像视图时,将标志更改为true,因此从理论上讲应该取消可运行对象,但它会取消其他可运行的图像视图。这是图像视图的侦听器。

   private View.OnClickListener guessImageViewListener = new View.OnClickListener(){
        @Override
        public void onClick(View view) {
                startButtonState = true;

        }
    };

然后,问题是当我在图像视图上按其他索引视图中的其他图像视图时,将停止显示图像的过程。

0 个答案:

没有答案
相关问题