Java 在执行启动屏幕任务后强制关闭
在尝试在我的应用程序中实现闪屏后,我遇到了强制关闭问题 问题发生在第76行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
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不客气。如果这解决了您的问题,请单击复选标记接受答案。谢谢!(我只是在等待计时器过期)抱歉,太急躁了……现在已经很晚了:/不用担心!如果您想回答另一个简单的问题-我还有另一个问题!:)