簡體   English   中英

java.lang.RuntimeException:使用jsoup執行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("&nbsp;", "(") + ")    ");
            }
        } 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(...)中, titleListnull

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM