【问题标题】:Chunk of code not working in Android Studio but works perfectly in Eclipse?代码块不能在 Android Studio 中运行,但在 Eclipse 中完美运行?
【发布时间】:2017-08-10 04:52:09
【问题描述】:

所以我有这段使用 JSoup 的代码,我认为它不能正常工作(因为 JSoup 的大多数事情都需要至少一点点修补才能正确)。但是,我一直在尝试,但我的代码无法在 Android Studio 中运行。最后,我用 Eclipse 试试运气,唉,同样的代码块运行良好!当然,由于我正在开发一个应用程序,我需要这段代码才能在 Android Studio 上运行,但我不知道如何才能让它运行!

这是在 Eclipse 上运行但不是在 Studio 上运行的代码块:

String link= doc.select("div.searchTemplate.listLayout.so_us_en")
                        .select("div[id= topDynamicContent]")
                        .select("div.a-row.a-spacing-base.searchUndoAUIHacks")
                        .select("div.a-row")
                        .select("div.a-column.a-span8.a-spacing-none")
                        .select("div.s-first-column")
                        .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text();
                System.out.println(link);
                int listSize= Integer.parseInt(link.substring(2,4));
                System.out.println(listSize); 

以下是 Studio 给我的错误消息:

08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.text()' on a null object reference
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at com.velesapp.jsouptutorial.MainActivity$getProductAttributes.doInBackground(MainActivity.java:82)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at com.velesapp.jsouptutorial.MainActivity$getProductAttributes.doInBackground(MainActivity.java:58)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:305)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:     at java.lang.Thread.run(Thread.java:761)

对于两个 IDE,导入完全相同,我正在通过 Android Studio 使用 AsyncTask 运行进程,但在 Eclipse 中没有使用任何线程。

这里是完整的代码:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class MainActivity extends AppCompatActivity {
    Button but;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        but = (Button)findViewById(R.id.but1);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

               new getProductAttributes("https://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Delectronics&field-keywords=rx+390").execute();


            }
        });



    }

    public class getProductAttributes extends AsyncTask<Void,Void,Void>{
        String url;
        int listSize;

        public getProductAttributes(String url){
            this.url = url;
        }
        protected Void doInBackground (Void... voids) {
          try{
                Document doc = Jsoup.connect(url).get();
                String link= doc.select("div.searchTemplate.listLayout.so_us_en")
                        .select("div[id= topDynamicContent]")
                        .select("div.a-row.a-spacing-base.searchUndoAUIHacks")
                        .select("div.a-row")
                        .select("div.a-column.a-span8.a-spacing-none")
                        .select("div.s-first-column")
                        .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text();
                System.out.println(link);
                listSize= Integer.parseInt(link.substring(2,4));
                System.out.println(listSize);

                }catch (Exception e){e.printStackTrace();}

                return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);


        }

感谢您的宝贵时间!

【问题讨论】:

  • 你能发一个minimal reproducible example吗?
  • 可能与 AsyncTask 而非 IDE 有关?你不能在 Eclipse 中设置最新的 android 项目
  • 正如@suraj 提到的 - ASyncTask - 您能否向我们提供您使用的完整 Android Studio 代码(尤其是 ASyncTask)??
  • 编辑了我的原始帖子以添加完整代码,请随意看看:)

标签: java android eclipse jsoup


【解决方案1】:

我检查了您的代码,它完全可以正常工作。 另一方面,不起作用的是,您在 div 容器上的第一个选择。

我的意思是:

doc.select("div.searchTemplate.listLayout.so_us_en")

因为listLayout 不存在于 DOM 树中。

我对您正在解析的网站进行了一些研究。您应该将listLayout 更改为:correctedResultsLayout

这将导致以下结果:

String link = doc.select("div.searchTemplate.correctedResultsLayout.so_us_en")
                    .select("div[id= topDynamicContent]")
                    .select("div.a-row.a-spacing-base.searchUndoAUIHacks")
                    .select("div.a-row")
                    .select("div.a-column.a-span8.a-spacing-none")
                    .select("div.s-first-column")
                    .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text();

我还对您的 substring 方法做了一些更改:

        System.out.println(link);
        listSize = Integer.parseInt(link.substring(0, 2));
        System.out.println(listSize);

然后将打印找到的结果数量(在我的例子中:21)

注意:请记住,您可能需要更改此设置!

编辑:

只是对您的一点建议或改进问题。只搜索匹配的 id 不是更好/更好吗?在这种情况下,您可以提高自己代码的可读性。

对于您的选择,这意味着 - 将杀手 doc.select(....)... 语句更改为更小更易读:

String link = doc.select("h2#s-result-count").first().text();

【讨论】:

  • 这行得通,并且以某种方式摆脱了 Studio 中的 NullPointerException,谢谢!还要感谢搜索匹配 id 的提示,这比必须选择一系列元素要好得多。再次感谢!
最近更新 更多