螺纹/处理器错误 - 指定的消息队列的同步屏障令牌尚未发布(Thread/Handler error

2019-08-20 04:15发布

我得到这个错误 -

java.lang.IllegalStateException:指定的消息队列的同步屏障令牌尚未发布的或已被移除。

作为一个相对较新的的Java / Android的,这是毫无疑问不是我错过了,但我做的是这样的 -

我有一个使用EXIF数据,根据他们拍摄日期显示照片一个项目,其目的是采用类似的模式在每个阶段...

工作线程 - > UI线程 - >自定义显示适配器。 然后点击在GridView的“细胞”的一个触发下一个活动。 第一个活动搜索所有的照片文件,开创了“年”的列表,然后每一个后续活动它过滤到月,日等。

启动第二个活动启动但直入上面的错误,以及消息被处理的,经基本线程/处理器设置。

这里是传递消息给线程的类 -

public class MonthSort {
Handler handler;
int imageWidth;
List<PhotoData> photoList;
public MonthSort(Handler handler2, int width, List<PhotoData> pList) {
    photoList = new ArrayList<PhotoData>();
    photoList = pList;
    imageWidth = width;
    handler = handler2;
}

public void sortFiles()
{
    int month, photoCount;
    File fileName = new File("");
    Message msg = handler.obtainMessage();
    //Message msg = Message.obtain();
    //Bundle bundle = new Bundle();
    try {
        for (int i = 0; i < 12; i++) {
            month = i + 1;
            photoCount = 0;
            for (PhotoData pd : photoList) {
                if(month == pd.month)
                {
                    if(photoCount == 0)
                        fileName = pd.fileName;
                    photoCount++;
                }
            }
            if(photoCount != 0)
            {

                Bundle bundle = new Bundle();
                bundle.putString("filename", fileName.toString());
                bundle.putInt("month", month);
                bundle.putInt("count", photoCount);
                byte[] thumbNail = getThumbnail(fileName, imageWidth);
                bundle.putByteArray("thumbnail", thumbNail);


                msg.setData(bundle);
                handler.sendMessage(msg);

            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("Debug", "handler error occurs in monthSort class");
    }
    /*Bundle bundle = new Bundle();
    bundle.putBoolean("end", true);
    msg.setData(bundle);
    handler.sendMessage(msg);*/
}

...这是接受它在UI线程的代码。

public class MonthActivity extends Activity {
List<PhotoData> photoList;
static List<MonthData> photos;
int imageWidth;
GridView photoGrid;
static ImageAdapter2 iAdapter;
int year;
Thread monthSortThread;

Handler handler2 = new Handler() {
    @Override
    public void handleMessage(Message msg) 
    {
        Bundle bundle = msg.getData();  // Get the message sent to the Handler.
        boolean ended = bundle.getBoolean("end");
        if(ended)
        {
            //Toast.makeText(getBaseContext(), "FINISHED !!!", Toast.LENGTH_LONG).show();
        } else
        {
            try {
                MonthData md = new MonthData();
                md.monthValue = bundle.getInt("month");
                md.monthString = getMonthString(md.monthValue);
                md.count = bundle.getInt("count");
                byte[] tn = bundle.getByteArray("thumbnail");
                md.thumbnail =  BitmapFactory.decodeByteArray(tn, 0, tn.length);
                photos.add(md);
                iAdapter.notifyDataSetChanged();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                Log.d("Debug", "handler error occurs in UI Handler");
            }
        }
    }
};

请注意,我并没有包括所有的代码,只是我觉得是相关的部分。

以前的活动管理,以同样的方式操作成功的消息,为什么没有第二个活动?

据我所知,在主UI线程已经有一个活套设置,因此您不必创建一个。 是的静止推出任何后续活动是真的吗?

Answer 1:

这个问题是通过处理器的在DispatchMessage方法来解决,而不是的sendMessage。



Answer 2:

像你一样在这里我得到了同样的问题。 经过两天的斗争中,我找到了一种方法来解决它。 很简单。 只需在您的handlerMessage()更新任何UI前添加this.obtainMessage()。 这样做了以后,一切都将现在被罚款。

我想这是因为我们在UI线程和后台线程之间太快其中局面Android系统无法正常调度消息全部由自己沟通。 当我们强迫的Android这样做,问题就迎刃而解了。 我不知道,这只是一个猜测。 我希望它可以帮助你。



文章来源: Thread/Handler error - The specified message queue synchronization barrier token has not been posted