首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓System.Err for setVisibility(View.GONE)?

安卓System.Err for setVisibility(View.GONE)?
EN

Stack Overflow用户
提问于 2015-12-24 20:48:05
回答 1查看 198关注 0票数 0

为了更好地学习android,我在一个基本的调查应用程序中注意到了一个bug。

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

代码语言:javascript
复制
button.setVisibility(View.GONE);

我以前多次使用setVisibility,从来没有遇到过任何问题。

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

代码语言:javascript
复制
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这条线,这让我对事情是否正确感到犹豫不决。

编辑活动:

代码语言:javascript
复制
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);

        }
    }

}

该活动实现了这个类:

代码语言:javascript
复制
public abstract interface SurveyListener
{
    public abstract void surveyAvailable(boolean surveyAvailable);
}

主要应用程序类,它检查调查并调用‘surveyAvailable()’:

代码语言:javascript
复制
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) {

        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 22:28:05

您不应该修改来自不同线程的UI元素。这是通过在后台线程上调用App.getInstance().alertAvailability(_surveyAvailable);来完成的。将其移动到AsyncTask的onPostExecute

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34457775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档