[英]Force Close After Implementation of Splash Screen w AsyncTask
尝试在我的应用中实现启动画面后,我遇到了一个强制关闭问题。
问题发生在第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);
}
}
}
在splash.xml
是否有一个名为R.id.listView1
的splash.xml
? 看起来您已将setContentView()
调用更改为初始屏幕,但您的列表视图位于更“主”页面上。
不要打败死马,但是因为你用setContentView()
改变了layout
,所以lv
为null
。 也许我可以更好地解释为什么这是因为我不确定你是否完全理解Views
如何在Activity
工作。
当你调用setContentView()
它会膨胀你在这个函数中设置的xml layout
文件。 初始化不在该layout
文件中的任何View
将返回null
,当您尝试在其上设置方法setAdapter()
例如setAdapter()
时将提供NPE
。
看来你假设你仍然可以初始化另一个layout
文件中的ListView
......你做不到。 您只能使用Views
与膨胀setContentView()
或充气的layout
持有该文件View
并将其添加到当前膨胀`布局。
解决此问题的一种方法是在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);
lv
在这里可能是null。 您是否在调试器中验证了将其设置为(ListView) findViewById(R.id.listView1);
时它已正确设置(ListView) findViewById(R.id.listView1);
?
空指针异常表明lv可能存在问题。 您已更改xml的名称。验证是否在splash.xml中存在R.id.listview1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.