【问题标题】:Force Close After Implementation of Splash Screen w AsyncTask执行启动画面 w AsyncTask 后强制关闭
【发布时间】:2013-09-19 19:26:12
【问题描述】:

尝试在我的应用中实现启动画面后,我遇到了强制关闭问题。

问题出现在第 76 行 lv.setAdapter(adapter); 但我不确定原因。

非常感谢任何输入。

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

【问题讨论】:

    标签: java android fatal-error forceclose


    【解决方案1】:

    不要打死马,但lvnull,因为您将layout 更改为setContentView()。也许我可以更好地解释一下为什么会这样,因为我不确定您是否完全理解 ViewsActivity 中的工作原理。

    当您调用setContentView() 时,它会膨胀您在此函数中设置的xml layout 文件。在该layout 文件中初始化任何notView 将返回null,当您尝试对其设置诸如setAdapter() 之类的方法时,这将给出NPE

    您似乎假设您仍然可以初始化另一个layout 文件中的ListView...您不能。您只能使用ViewssetContentView() 膨胀或通过膨胀包含Viewlayout 文件并将其添加到当前膨胀的`布局。

    解决此问题的一种方法是在onPostExecute() 中再次调用setContentView() 然后初始化您的ListView 并设置Adapter。我通常不建议在单个Activity 中多次调用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);
    

    【讨论】:

    • “哦,哦,哦,这很神奇,你知道,/永远不要相信它不是这样......”感谢 CodeMagic! youtube.com/watch?v=4iiryJwvDtc
    • @OhNoItsAnOverflow 不客气。如果解决了您的问题,请单击复选标记接受答案
    • 确实...谢谢! (我只是在等待计时器到期)
    • 对不起,我太急了……今天很晚了:/
    • 别担心!附:如果您想回答另一个简单的问题 - 我还有另一个问题! :)stackoverflow.com/questions/18904302/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      lv 在这里可能为空。您是否在调试器中验证了将其设置为 (ListView) findViewById(R.id.listView1); 时设置正确?

      【讨论】:

      • 奇怪的是它工作正常,直到我改变 setContentView(R.layout.activity_main);到 setContentView(R.layout.splash);
      • 所以是的......它已被填充(直到我更改布局以显示启动屏幕,直到值被 asynctask 检索)
      • 所以lv 不包含在R.layout.splash 中,因此如果您尝试通过findViewById 获取它,它将为空。
      【解决方案4】:

      Null Pointer Exception 提示 lv 可能有问题。 您已更改 xml.so 的名称,因此请验证 R.id.listview1 是否存在于 splash.xml

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多