Java 在执行启动屏幕任务后强制关闭

Java 在执行启动屏幕任务后强制关闭,java,android,fatal-error,forceclose,Java,Android,Fatal Error,Forceclose,在尝试在我的应用程序中实现闪屏后,我遇到了强制关闭问题 问题发生在第76行lv.setAdapter(适配器)但是我不确定为什么 非常感谢您的任何意见 09-19 15:20:53.687: E/AndroidRuntime(25177): FATAL EXCEPTION: main 09-19 15:20:53.687: E/AndroidRuntime(25177): java.lang.NullPointerException 09-19 15:20:53.687: E/AndroidRu

在尝试在我的应用程序中实现闪屏后,我遇到了强制关闭问题

问题发生在第76行
lv.setAdapter(适配器)但是我不确定为什么

非常感谢您的任何意见

09-19 15:20:53.687: E/AndroidRuntime(25177): FATAL EXCEPTION: main
09-19 15:20:53.687: E/AndroidRuntime(25177): java.lang.NullPointerException
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:76)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:1)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Looper.loop(Looper.java:137)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.app.ActivityThread.main(ActivityThread.java:4931)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invokeNative(Native Method)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at dalvik.system.NativeStart.main(Native Method)
资料来源:

public class MainActivity extends Activity {
    Context context;
    ArrayList<String> aa = new ArrayList<String>();
        ListView lv;
        final String URL = "http://news.google.com";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
            setContentView(R.layout.splash);
            lv= (ListView) findViewById(R.id.listView1);
            new MyTask().execute(URL);

        }

        private class MyTask extends AsyncTask<String, Void, String> {
            ProgressDialog prog;
            String title = "";

            @Override
            protected void onPreExecute() {
                prog = new ProgressDialog(MainActivity.this);
                prog.setMessage("Loading....");
                prog.show();
            }

            @Override
            protected String doInBackground(String... params) {
                try {
                    Document doc = Jsoup.connect(params[0]).get();
                    Element tableHeader = doc.select("tr").first();

                    for (Element element : tableHeader.children()) {
                        aa.add(element.text().toString());
                    }

                    title = doc.title();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return title;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                prog.dismiss();
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
                lv.setAdapter(adapter);
            }
        }
    }
公共类MainActivity扩展活动{
语境;
ArrayList aa=新的ArrayList();
ListView lv;
最终字符串URL=”http://news.google.com";
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
setContentView(R.layout.splash);
lv=(ListView)findViewById(R.id.listView1);
新建MyTask().execute(URL);
}
私有类MyTask扩展了AsyncTask{
进程对话程序;
字符串标题=”;
@凌驾
受保护的void onPreExecute(){
prog=新建进度对话框(MainActivity.this);
程序设置消息(“加载…”);
prog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
Document doc=Jsoup.connect(参数[0]).get();
元素tableHeader=doc.select(“tr”).first();
for(元素:tableHeader.children()){
aa.add(element.text().toString());
}
title=doc.title();
}捕获(IOE异常){
e、 printStackTrace();
}
返回标题;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
程序解除();
ArrayAdapter=新的ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,aa);
低压设置适配器(适配器);
}
}
}

lv
在此处可能为空。当您将其设置为
(ListView)findViewById(R.id.listView1)时,是否已在调试器中验证其设置是否正确

splash.xml
中是否有名为
R.id.listView1
的视图?看起来您更改了对初始屏幕的
setContentView()
调用,但您的listview位于更“主”的页面上。

空指针异常表明lv可能有问题。
您已更改了xml的名称。因此,请验证splash.xml中是否存在R.id.listview1。使用
setContentView()
更改
布局后,
lv
null
。也许我可以更好地解释一下为什么会这样,因为我不确定您是否完全理解
视图
活动
中是如何工作的

当您调用
setContentView()
时,它会膨胀您在此函数中设置的
xml布局文件。初始化
布局
文件中的任何
视图
将返回
null
,当您尝试在其上设置方法(如
setAdapter()
)时,它将给出一个
NPE

似乎您仍然可以初始化另一个
布局
文件中的
列表视图
,但您不能。您只能使用通过
setContentView()
充气的
视图
,或者通过充气保存该
视图的
布局
文件并将其添加到当前充气的布局中

解决此问题的一种方法是在
onPostExecute()
中再次调用
setContentView()
,然后
初始化
列表视图
并设置
适配器
。我通常不建议在单个
活动中多次调用
setContentView()
,但在您的情况下,这可能是您当前拥有的最简单的方法

所以看起来可能是这样的

  @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            prog.dismiss();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.listView1);
            lv.setAdapter(adapter);
@覆盖
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
程序解除();
ArrayAdapter=新的ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,aa);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.listView1);
低压设置适配器(适配器);

奇怪的是,在我将setContentView(R.layout.activity_main)更改为setContentView(R.layout.splash)之前,它可以正常工作;所以是的……它被填充了(直到我更改了布局以显示启动屏幕,直到asynctask检索到值为止)所以
lv
不包含在
R.layout.splash中,所以如果您试图通过
findViewById
获取它,它将是空的。“哦,哦,哦,哦,这很神奇,你知道,/永远不要相信它不是这样的…”谢谢CodeMagic!@OhNoItsAnOverflow不客气。如果这解决了您的问题,请单击复选标记接受答案。谢谢!(我只是在等待计时器过期)抱歉,太急躁了……现在已经很晚了:/不用担心!如果您想回答另一个简单的问题-我还有另一个问题!:)