繁体   English   中英

Android:为什么此代码无法在onCreate中运行,或者如何在没有线程的情况下使其运行?

[英]Android: Why won't this code run in onCreate, or how can I make it work without a thread?

我将这段代码放在Eclipse中时可以正常运行,但是由于某些原因,当我将其放在Android Studio中活动的onCreate方法中时,它不想执行。

这是代码:

public class ItemListView extends AppCompatActivity{
    String itemURL;
    int listSize;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_list_view);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

          Bundle itemData = getIntent().getExtras();
        if(itemData==null){
            return;
        }

        //Gets URL from search bar
        itemURL = itemData.getString("itemURL");

        try {
            Document doc = Jsoup.connect("https://www.amazon.com/s/ref=nb_sb_ss_c_1_6?url=search-alias%3Daps&field-keywords=rx+390&sprefix=rx+390%2Caps%2C166&crid=2MTUBA4KGNY06").get();
            String link = doc.select("h2#s-result-count").first().text();
            System.out.println(link);
            System.out.println(link.substring(1));
            if (link.substring(1, 2).equals("-")) {
                System.out.println("run1");
                listSize = Integer.parseInt(link.substring(2, 3));
                System.out.println(listSize);
                try {
                    listSize = Integer.parseInt(link.substring(2, 4));
                    System.out.println(listSize);
                } catch (Exception e) {
                }
            } else {
                System.out.println("run2");
                listSize = Integer.parseInt(link.substring(0, 1));
                System.out.println(listSize);
                try {
                    listSize = Integer.parseInt(link.substring(0, 2));
                    System.out.println(listSize);
                } catch (Exception e) {
                }
            }
            } catch (Exception e) {
        }

        System.out.println("listSize: " +listSize);
        ...
    }
}

我需要listSize根据URL创建一个变量数组,但是当我打印该值以确保它正常工作时,它始终为我提供0。我曾尝试使用AsyncTask在单独的Java类中运行代码,并且可以工作,但是通过当代码在onPostExecute中执行时,为时已晚,因为上面的类已经尝试初始化数组。

任何建议,将不胜感激,谢谢!

您需要一个回调以允许您初始化变量onPostExecute

interface OnCallCompleteCallBack {
    void onCallComplete(int listSize);
}

在您的AsyncTask执行以下操作:

public class MyTask extends AsyncTask < ... > {
    // Maintain a ref to callback
    OnCallCompleteCallBack callback;

    MyTask(OnCallCompleteCallBack callback) {
        this.callback = callback;
    }

    ...

    @Override
    protected void onPostExecute(Void aVoid) {
        if (callback != null) {
            callback.onCallComplete(listSize);
        }
    }
}

使您的Activity实现OnCallCompleteCallBack并像这样启动AsyncTask

new MyTask(this).execute();

然后,您可以在活动的onCallComplete()实现中使用该值

在回答之前,请注意以下几点:

  • 给您的活动ItemListView命名似乎是错误的(一个Activity不是一个View )。

  • 您永远不要在UI线程上执行网络调用。

  • 如果要登录,则应使用Log而不是System.out.println()

现在回答。 您应该执行在AsyncTask中获取数据的代码(如您所提到的那样)。 提取数据后,您应该更新数组,然后在onPostExecute()更新UI。

Android使用MVC (模型-视图-控制器)模式可以很好地工作,而您的问题就是经典情况,您需要使用服务器中的数据来更新模型并相应地更新视图。 在这种情况下,活动代表控制器。

请仔细阅读android开发人员网站Android Developer中的主题,阅读“在单独的线程上介绍网络操作”部分-为了避免创建无响应的UI,请不要在UI线程上执行网络操作。 默认情况下,Android 3.0(API级别11)及更高版本要求您在除主UI线程之外的其他线程上执行网络操作; 如果不这样做,则会引发NetworkOnMainThreadException。

谢谢阿希什

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM