为了更好地学习android,我在一个基本的调查应用程序中注意到了一个bug。
偶尔我会得到一个指向这一行代码的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()’:
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) {
}
}
}发布于 2015-12-24 22:28:05
您不应该修改来自不同线程的UI元素。这是通过在后台线程上调用App.getInstance().alertAvailability(_surveyAvailable);来完成的。将其移动到AsyncTask的onPostExecute。
https://stackoverflow.com/questions/34457775
复制相似问题