【发布时间】:2014-04-02 13:01:31
【问题描述】:
我正在寻找在 AsyncTask 中更改自定义视图可见性的解决方案。我读过这个:
How to handle visibility changes for a custom android view/widget
但这对我没有帮助,因为我不知道如何处理接口。我已经把它放在我的自定义视图类中,但是我在哪里注册监听器?在我有 AsyncTask 的 Activity 中?那么onSetVisibilityCalled()这个方法应该怎么做呢?
希望你能帮助我,感谢你的帮助。
代码sn-p:
public Class MyActivity extends Activity{
private ProgressBar myProgressBar;
private MyCustomView myCustomView;
private MyTask myTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super(savedInstanceState);
setContentView(R.layout.my_activity_layout.xml);
myProgressBar = (ProgressBar) findViewById(R.id.myProgressBar);
myCustomView = (MyCustomView) findViewById(R.id.myCustomView);
myTask = new MyTask();
myTask.execute();
}
private class MyTask extends AsyncTask<Void, Void, Void>{
protected void onPreExecute(){
myProgressBar.setVisibility(View.VISIBLE);
// Here I would like to change the visibility of my Custom View to GONE
// myCustomView.setVisibility(View.GONE);
}
@Override
protected void doInBackground(Void... params){
//... do something
}
protected void onPostExecute(){
myProgressBar.setVisibility(View.GONE);
// Here I would like to change the visibility of my Custom View to VISIBLE
// myCustomView.setVisibility(View.VISIBLE);
}
}
}
如果我取消注释 myCustomView.setVisibility(View.GONE);在 onPreExecute()-Method 中出现以下错误:
04-02 16:04:47.016: E/AndroidRuntime(322): 致命异常: main 04-02 16:04:47.016: E/AndroidRuntime(322): java.lang.RuntimeException: 无法开始活动 组件信息{com.example.test/com.example.test.MyActivity}: java.lang.NullPointerException 04-02 16:04:47.016: E/AndroidRuntime(322):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.app.ActivityThread.access$700(ActivityThread.java:159) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.os.Handler.dispatchMessage(Handler.java:99) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.os.Looper.loop(Looper.java:176) 04-02 16:04:47.016: E/AndroidRuntime(322):在 android.app.ActivityThread.main(ActivityThread.java:5419) 04-02 16:04:47.016:E/AndroidRuntime(322):在 java.lang.reflect.Method.invokeNative(Native Method) 04-02 16:04:47.016:E/AndroidRuntime(322):在 java.lang.reflect.Method.invoke(Method.java:525) 04-02 16:04:47.016: E/AndroidRuntime(322):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 04-02 16:04:47.016:E/AndroidRuntime(322):在 dalvik.system.NativeStart.main(Native Method) 04-02 16:04:47.016: E/AndroidRuntime(322):引起:java.lang.NullPointerException 04-02 16:04:47.016:E/AndroidRuntime(322):在 com.example.test.MyActivity$FetchLocationTask.onPreExecute(MyActivity.java:55) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.os.AsyncTask.execute(AsyncTask.java:534) 04-02 16:04:47.016: E/AndroidRuntime(322):在 com.example.test.MyActivity.onCreate(MyActivity.java:32) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.app.Activity.performCreate(Activity.java:5372) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 04-02 16:04:47.016: E/AndroidRuntime(322): ... 11 更多
【问题讨论】:
-
只需取消注释
onPreExecute()和onPostExecute()中的myCustomView.setVisibility(..)行。那应该可以。 -
我做到了,并使用 LogCat 中显示的错误编辑了我的问题。我希望他们能告诉你一些事情。
-
是的,他们做到了。检查答案
标签: android android-asynctask android-custom-view