【问题标题】:Android System.Err for setVisibility(View.GONE)?用于 setVisibility(View.GONE)的 Android System.Err?
【发布时间】:2016-03-31 04:37:40
【问题描述】:

我注意到我正在制作的用于更好地学习 Android 的基本调查应用程序中存在错误。

偶尔我会得到一个指向这行代码的W/System.err﹕ at MainActivity.surveyAvailable(MainActivity.java:40)

button.setVisibility(View.GONE);

我之前多次使用setVisibility,从未遇到任何问题。

这是函数,当用户第一次进入应用程序时调用它,在他们完成调查以检查服务器并查看是否有另一个可供用户使用的调查后:

public void surveyAvailable(boolean surveyIsAvailable) {
        Log.d("MainActivity", "App survey is available? " + surveyIsAvailable );
        Button button = (Button)findViewById(R.id.takeSurveyButton);

        if (surveyIsAvailable) {
            button.setVisibility(View.VISIBLE);

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    App.getInstance().showSurvey();
                }
            });
        } else {
            Log.d("MainActivity", "We hit here");
            button.setVisibility(View.GONE);

        }
    }

当调查不可用时,会记录相应的行 - App survey is available? false 和“我们点击这里”。但是有时按钮没有设置为View.GONE,我看到了 System.Err 行。但有时它工作正常,按钮的可见性确实发生了变化。知道如何解决吗?或者如何获取有关 System.Err 实际含义的更多信息?

编辑:

我发现通过在我的活动中设置Button surveyButton; 然后将按钮引用为this.surveyButton 似乎可以使功能更符合我们的预期(例如,当我们调用button.setVisibility(View.GONE) 时,视图实际上始终是GONE)。但它仍然会抛出 System.Err 行,这让我对事情是否正常工作感到犹豫。

编辑的活动:

public class MainActivity extends ActionBarActivity implements SurveyListener {
    Button surveyButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.surveyButton = (Button)findViewById(R.id.takeSurveyButton);
    }

    public void surveyAvailable(boolean surveyIsAvailable) {
        Log.d("MainActivity", "App survey is available? " + surveyIsAvailable );

        if (surveyIsAvailable) {
            this.surveyButton.setVisibility(View.VISIBLE);

            this.surveyButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    App.getInstance().showSurvey();
                }
            });
        } else {
            Log.d("MainActivity", "We hit here");
            this.surveyButton.setVisibility(View.GONE);

        }
    }

}

活动实现了这个类:

public abstract interface SurveyListener
{
    public abstract void surveyAvailable(boolean surveyAvailable);
}

检查调查并调用“surveyAvailable()”的主 App 类:

public class App
{
    private static App _instance;
    private SurveyListener _eventsHandler;
    private String _apiKey = "";
    private String _appuserId = "";
    private String _surveyUrl = "";
    private Activity _parentContext;
    private Boolean _surveyAvailable;

    public static App initWithApiKeyAndListener(String apiKey, SurveyListener surveyEventsHandler) {
        if (_instance == null)
        {
            _instance = new App();
            _instance._parentContext = (Activity) surveyEventsHandler;
            _instance.setSurveyListener(surveyEventsHandler);
            _instance.setApiKey(apiKey);

            String appuserId = PreferenceManager.getDefaultSharedPreferences((Activity) _instance._eventsHandler).getString(tag, "no_appuser");
            if (appuserId == "no_appuser") {
                _instance._surveyAvailable = true;
                _instance.alertAvailability(true);
            } else {
                _instance.checkForCampaigns();
            }
        }

        return _instance;

    }

    private void alertAvailability(boolean surveyAvailable) {
        App.getInstance()._eventsHandler.surveyAvailable(surveyAvailable);
    }

    private void checkForCampaigns() {
        new CampaignCheck().execute();
    }

    public static App getInstance()
    {
        if (_instance == null)
        {
            _instance = new App();
        }
        return _instance;
    }

    public void donePushed()
    {
        App.getInstance().checkForCampaigns();
    }

    private class CampaignCheck extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... params) {

            Boolean surveysAvailable = false;
            try {
                surveysAvailable = new AppuserConnection().checkCampaigns();
                App.getInstance()._surveyAvailable = surveysAvailable;
                App.getInstance().alertAvailability(_surveyAvailable);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

        }
    }
}

【问题讨论】:

  • 查看此链接Similar problem
  • 是的,我之前发现了一个,但它似乎并没有解决我的问题。似乎问题在于他首先被称为View.INVISIBLE,然后是View.GONE,而在这里我只是在做后者
  • 什么是调用surveyAvailable() 方法?
  • 如果您第一次将button 设置为INVISIBLE 而不是GONE,请检查您的布局xml 文件
  • 我的布局中没有可见性属性,我尝试在那里添加可见性,但发生了同样的交易。我要添加调用surveyAvailable的代码

标签: java android


【解决方案1】:

您不应从不同的线程修改 UI 元素。您可以通过在后台线程上调用 App.getInstance().alertAvailability(_surveyAvailable); 来执行此操作。将此移动到 AsyncTask 的 onPostExecute

【讨论】:

  • 应该明白这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2013-04-17
  • 2018-09-11
  • 2014-01-30
  • 2015-09-10
  • 2020-10-31
  • 2015-12-20
相关资源
最近更新 更多