当前位置: 首页 > 知识库问答 >
问题:

Android系统。setVigic(View. GONE)出错?

常明亮
2023-03-14

为了更好地学习android,我正在制作一个基本调查应用程序,其中有一个bug。

偶尔我会得到一个W/系统。犯错误﹕ 在主要活动中。surveyAvailable(MainActivity.java:40)指向以下代码行:

button.setVisibility(View.GONE);

我以前多次使用setVigic,从来没有任何问题。

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

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);

        }
    }

当调查不可用时,会记录适当的行-应用程序调查可用吗?false和“我们点击这里”。但是按钮有时不会设置为View. GONE,我看到了System. Err行。但是有时它工作正常,按钮的可见性确实会改变。知道如何修复这个问题吗?或者如何获得更多关于System. Err实际意思的信息?

编辑:

我发现通过在我的活动中设置按钮调查按钮,然后将按钮引用为this.survey按钮似乎可以让功能更符合我们的期望(例如,当我们调用button.set可见性(视图。消失)视图实际上是一致的消失)。但是它仍然抛出系统。错误行,这让我犹豫事情是否正常工作。

编辑活动:

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()”的主应用程序类:

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) {

        }
    }
}

共有1个答案

彭嘉赐
2023-03-14

您不应该从不同的线程修改UI元素。你可以通过调用应用程序来实现这一点。getInstance()。alertAvailability(_surveyAvailable) 在后台线程上。将其移动到AsyncTask的onPostExecute

 类似资料:
  • 我使用javamail api发送邮件。首先,我尝试了gmail smtp服务器,一切正常。但现在我想使用自己的邮件服务器(通过cPanel)。但我的财产有问题。有人能帮我吗? 这是我的属性代码: 以下是cPanel的服务器信息: 用户名:blabllabla@blabla.com 密码:blablabla。 输出服务器:cpanel4.onofis.com SMTP:端口465 IMAP、POP

  • 我在做一个简单的应用程序。它只是有一个弹出屏幕,内向,概览,然后是带有图像按钮的主页面图像按钮将意图模块与图像。 给出错误的XML: Java:

  • 我是OSGi的新手。我正在Android上运行ApacheFelix。我已将系统包导出的系统包设置如下: 但是,当我尝试安装ConfigAdmin捆绑包时,它会给出一个BundleException: 当我导出组织时,为什么它缺少这个要求。奥斯基。版本1.6的系统包中的框架包。0? 我已通过以下操作检查系统属性设置是否正确: 也许这是我的一个简单错误。有人能帮我吗? 谢谢!

  • 问题内容: 在android 4.0之前,您可以使用TYPE_SYSTEM_OVERLAY创建并覆盖任何应用程序,并通过FLAG_WATCH_OUTSIDE_TOUCH获取触摸…现在,在android 4中,您无法接收触摸。 基本上,这个想法就是遵循这个应用程序的,即 http://www.appbrain.com/app/smart- taskbar-%28sidebar%29/com.smar

  • 7.2.2.Android系统资源 我们的程序都有自己的资源,Android系统也同样。Android系统中内置了许多图标、图像、音频等等各种资源文件。回想下,应用程序的资源文件都在/res/目录之下,要在XML中引用它们,只需填上地址即可;而引用系统资源,则需要为地址加一个前缀android:,比如@android:drawable/ic_menu_preferences。在Java中引用的话,

  • 在我的应用程序中,我得到了android。操作系统。NetworkOnMainThreadException。我正在尝试从url获取图像,当时我遇到了这个异常。若我在2.2中运行应用程序,它可以正常工作,但若我在4.0中运行,就会出现异常。 我有错误 在这一行请帮我解决这个问题 我使用了AsyncTask 我在这行中遇到了错误: Logcat: