【问题标题】:AsyncTask isnt filling a layoutAsyncTask 未填充布局
【发布时间】:2013-04-29 21:47:16
【问题描述】:

我有一个简单的LinearLayout,ID 为content

我有另一个布局,一个相对 (id = entry)。根据 php 文件的响应,该相对值将被夸大数次。

问题是,如果我手动将 entry 布局膨胀 4 次,它就可以正常工作。这是使用的代码:

LinearLayout content = (LinearLayout) Events.this.findViewById(R.id.content);
    for (int i=0; i<4;i++){
        RelativeLayout event = (RelativeLayout) mInflater.inflate(R.layout.event_entry, null);
        content.addView(event);
    }

但现在,问题是我在 AsyncTask 上执行此操作时无法实现。

AsyncTask 本身工作正常。

  • PreExecute() 设置为什么都不做。
  • OnBackground() 向我的计算机上托管的 php 文件发出 http 请求,该 php 正在返回一个 json,其中包含来自名为 Event 的自定义类的多个对象。我将这些对象保存到 HashMap 中。 Hashmap 已正确填充(调试:{1=Event@40dd9708, 0=Event@40dd9628})。可以看到,Event 的两个对象在 HashMap 上。
  • OnPostExecute() 包含此代码:

    protected void onPostExecute() {
        Log.d("debugging","Omplo llistat amb"+Events.this.events.toString());
        LinearLayout content = (LinearLayout) Events.this.findViewById(R.id.content);
        for (int i=0; i<Events.this.events.size()+1;i++){
    
            RelativeLayout event = (RelativeLayout) mInflater.inflate(R.layout.event_entry, null);
            Event eventDesat = Events.this.events.get(""+i);
            TextView title = (TextView) event.findViewById(R.id.title);
            title.setText(eventDesat.getTitle());
            content.addView(event);
        }
    }
    

但它没有填充任何东西。

尝试了event.getParent().invalidate(); 之类的方法,但结果相同。

你明白发生了什么吗? 我真的看不出第一个示例代码和下面的真实代码有什么区别。请注意,循环应该循环两次。

似乎永远不会触发 onPostExecute:

protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        SharedPreferences settings = getSharedPreferences("login", MODE_PRIVATE);
        int loggedin = settings.getInt("logged", 0);
        if (loggedin == 0){
            Events.this.finish();
        }
        String username = settings.getString("username", "");
        String password = settings.getString("password", "");
        params.add(new BasicNameValuePair("username", username));
        params.add(new BasicNameValuePair("password", password));

        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(Events.this.urlWebRetrieveEvents, "POST", params);

        // Check your log cat for JSON reponse
        if (json!= null){
            //Log.d("Debugging", json.toString());
            try {
                int success = json.getInt("success");
                if (success == 1){
                    //this is filling hashmap correctly
                    Log.d("debugging","AQUI VAAA"+Events.this.events.toString());
                }
            } catch (Exception e){
                //algo malo. no internet? perdudes les dades? Crec que mai hauriem d'entrar aquí.
            }
        }
        return null;

    }

【问题讨论】:

  • 先排除简单的问题...循环是否被执行? Events.this.events.size() > 0 吗?
  • 为什么在条件中加1?通常 size 方法返回结果从 1 开始。0 表示为空。
  • @Gustek 只是一些调试尝试,无论如何都不应该有影响。
  • 我刚刚发现,onPostExecute 从未被调用过。 Log.d("debugging","Omplo llistat amb"+Events.this.events.toString()); 没有填满 logcat
  • 如果执行它,您将获得 NLP;如果您使用标准集合列表,您将获得 IndexOutOfBound。发布 doInBackground 和 logcat。

标签: android android-layout android-asynctask


【解决方案1】:

尝试改变

protected void onPostExecute() {

protected void onPostExecute(Void result) {

【讨论】:

    【解决方案2】:

    有史以来最愚蠢的错误。

    我的 AsyncTask 是这样的: class RetrieveEvents extends AsyncTask&lt;String, String, String&gt;{

    所以我必须使用这样的 Override 来实现 onPostExecute: protected void onPostExecute(String str) {

    以前是: protected void onPostExecute() {

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      相关资源
      最近更新 更多