![](/img/trans.png)
[英]java.lang.RuntimeException: An error occured while executing doInBackground()
[英]java.lang.RuntimeException: An error occured while executing doInBackground() with jsoup
我是Android開發的初學者,但遇到此錯誤,導致我的Asynctask無法使用UI進行工作:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
我不明白為什么。 我正在使用Android Studio。 在構建要發布的版本之前,我的應用程序運行良好,但現在崩潰了。 這是我的課:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_my, null);
lv = (ListView) view.findViewById(R.id.listView1);
adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item, R.id.product_name, titleList);
new NewThread().execute();
return view;
}
public class NewThread extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg) {
Document doc;
try {
doc = Jsoup.connect("http://ot76.ru/mob/list.php?vt=" + (pageNumber + 1) + "&nl=0").get();
title = doc.select("a");
for (Element titles : title) {
titleList.add(titles.html().replace(" ", "(") + ") ");
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String str = lv.getItemAtPosition(position).toString();
Intent intent = new Intent(getActivity().getApplicationContext(), Rasp.class);
intent.putExtra("url", "http://ot76.ru/mob/getroutestr.php?vt=" + (pageNumber + 1) + "&nl=0&nmar=" + str.substring(0, str.indexOf(' ')).replace("к", "k").replace("а", "a").replace("б", "b").replace("с", "c").replace("д", "d"));
intent.putExtra("stops", lv.getItemAtPosition(position).toString().substring(str.indexOf(' '), str.length() - 1));
startActivity(intent);
}
});
}
}
問題解決了。 我只需要添加
-keep public class org.jsoup.** { public *; }
到我的proguard-android.txt文件。
從您的代碼看來,您正在用null (ArrayList)填充adapter
。 因此,您將獲得NPE
。
填滿titleList
之后,應在onPostExecute(...)中為ListView
創建adapter's object
,否則它將為空 。 在onCreateView(...)中, titleList
為null 。
在onCreateView(...)中創建titleList's
對象。
titleList = new ArrayList<String>();
從onCreateView(...)刪除此行
adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item, R.id.product_name, titleList);
在onPostExecute(...)中填充Web服務的值后,像這樣填充ListView
if(titleList != null) {
adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item, R.id.product_name, titleList);
lv.setAdapter(adapter);
}
編輯:嘗試創建custom adapter
類,並嘗試調試doc
不為null 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.