gpt4 book ai didi

java - 使用 AsyncTask 实现启动屏幕后强制关闭

转载 作者:行者123 更新时间:2023-12-02 06:43:20 25 4
gpt4 key购买 nike

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

问题发生在第 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);
}
}
}

最佳答案

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

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

看来您假设您仍然可以初始化位于另一个 layout 文件中的 ListView...但您不能。您只能使用通过 setContentView() 扩充的 Views 或通过扩充包含该 Viewlayout 文件并添加它到当前膨胀的`布局。

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

关于java - 使用 AsyncTask 实现启动屏幕后强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18903268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com