当前位置: 首页 > 知识库问答 >
问题:

如何根据从web服务读取的数据设置ListView元素

柴琦
2023-03-14

我正在尝试根据从webservice读取的数据设置ListView元素。我使用线程与Web服务通信。我从Web服务获取数据,但当我尝试将适配器设置为listView时,发生了致命的异常。这可能是什么原因?这是我的代码:

第一部分初始化listView:

l = (ListView) findViewById(R.id.listView1);

        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                getData();
            }

        };
        //Toast.makeText(CardChooseActivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show();
        (new Thread(runnable)).start();

第二部分(可运行线程内的getData方法):

   JSONArray jArray = new JSONArray(successMessage);
        String[] s = new String[jArray.length()];
        for (int i = 0; i < jArray.length(); i++)
        {
                JSONObject json_data = jArray.getJSONObject(i);                                                        
                s[i]=json_data.getString("id");
                System.out.println("String inside : " + s[i]);
                //data.add(json_data.getString("id"));
        }

        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, s);

        l.setAdapter(adapter);

和我的LogCat:

09-06 07:42:02.347: E/AndroidRuntime(418): FATAL EXCEPTION: Thread-10
09-06 07:42:02.347: E/AndroidRuntime(418): android.view.ViewRoot$CalledFromWrongThreadException:                 
Only the original thread that created a view hierarchy can touch its views.
09-06 07:42:02.347: E/AndroidRuntime(418):  at       
android.view.ViewRoot.checkThread(ViewRoot.java:2802)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1596)
09-06 07:42:02.347: E/AndroidRuntime(418):  at    
android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:451)
09-06 07:42:02.347: E/AndroidRuntime(418):  at android.view.View.setFlags(View.java:4474)
09-06 07:42:02.347: E/AndroidRuntime(418):  at     
android.view.View.setFocusableInTouchMode(View.java:3104)
09-06 07:42:02.347: E/AndroidRuntime(418):  at     
android.widget.AdapterView.checkFocus(AdapterView.java:694)
09-06 07:42:02.347: E/AndroidRuntime(418):  at   
android.widget.ListView.setAdapter(ListView.java:437)
09-06 07:42:02.347: E/AndroidRuntime(418):  at  
com.example.example.CardChooseActivity.getData(CardChooseActivity.java:166)
09-06 07:42:02.347: E/AndroidRuntime(418):  at  
com.example.example.CardChooseActivity.access$0(CardChooseActivity.java:122)
09-06 07:42:02.347: E/AndroidRuntime(418):  at     

通用域名格式。实例实例CardChooseActivity$1。运行(CardChooseActivity.java:73)09-06 07:42:02.347:E/AndroidRuntime(418):在java上运行。lang.Thread。运行(Thread.java:1096)

提前谢谢。

共有2个答案

段干开宇
2023-03-14

在run()方法中将数据从服务器解析到本地数组,然后将数组传递给适配器,并将适配器设置为ListView,但在单独的UI线程中,不能从非UI线程更新UI。

下面是一个如何使用处理程序解析数据并将其加载到ListView的示例。

另一种方法是使用runOnUiThread()。

秦雅逸
2023-03-14

如果您在android中使用handler,则需要更多的时间来接收响应,并且会打开ANR(android Not responding)对话框,强制用户提供两个选项。是关闭应用程序还是等待。要解决这个问题,请使用AsyncTask。。

 Use AsyncTask to perform this.
    @Override
  public void onClick(View v) {
  new Data().execute();
  }
   });
     }
      class Data extends AsyncTask<Void, Void, Void> { 
    /**
     * Before starting background thread
     * Show Progress Bar Dialog
     * */
       @Override
      protected void onPreExecute() {
        super.onPreExecute();
        showDialog(progress_bar_type);
    }
 
    /**
     * Downloading file in background thread
     * */
    @Override
    protected Void doInBackground(Void... f_url) {
        int count;
        try {
               JSONArray jArray = new JSONArray(successMessage);
        final String[] s = new String[jArray.length()];
        for (int i = 0; i < jArray.length(); i++)
        {
                JSONObject json_data = jArray.getJSONObject(i);                                                        
                s[i]=json_data.getString("id");
                System.out.println("String inside : " + s[i]);
                //data.add(json_data.getString("id"));
        }
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }
    }
 
    /**
     * Updating progress bar
     * */
 
    /**
     * After completing background task
     * Dismiss the progress dialog
     * **/
        @Override
        protected void onPostExecute(String file_url) {
        dismissDialog(progress_bar_type);
         adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, s);
        l.setAdapter(adapter);
       }
 
}
 类似资料:
  • 例如:如果我在01012020和01012021之间调用它,我将获得8000万个数据。 PS:web服务按一天的分页方式工作,也就是说,如果我想检索01/09/2020到07/09/2020之间的数据,我必须调用它几次(01/09-02/09之间,然后02/09-03/09之间,依此类推,直到06/09-07/09) 在这种情况下,如果数据很大,我的问题是堆空间内存。

  • 问题内容: 我试图使用Angular从远程WS以Json格式获取数据,但遇到了一些麻烦。数据正确地来自Web服务,但是我不能在控制器内部使用它。这是为什么?角度代码: HTML: 问题答案: 您应该将$ http.get放入控制器中。 而且,Web服务返回的对象不是数组。因此,您的ng-repeat应该是这样的: 这是一个工作示例:

  • 问题内容: 嗨,我习惯了SQL,但是我需要从HBase表读取数据。任何帮助都会很棒。一本书,或者只是一些示例代码,可以从表中读取。有人说使用扫描仪可以解决问题,但我不知道如何使用。 问题答案: 从网站:

  • 问题内容: 我正在尝试从清单文件中提取信息以在文件中的一种方法中显示,但是似乎存在一些问题。任何帮助表示赞赏。 清单文件: myClass.java: 输出: 那有什么呢?看起来pkg对象已正确定义,但是它不读取任何Specification或Implementation属性。 问题答案: 所以我终于弄清楚了,以为我愿意和别人分享我的头,以防其他人像我那样把头撞在那堵砖墙上。我再也无法让类中的方法

  • 问题内容: 我想使用Android将数据发送到我的php页面。我该怎么做? 问题答案: 您可以使用AndroidHttpClient进行GET或POST请求: 创建一个AndroidHttpClient来执行您的请求。 创建一个HttpGet或HttpPost请求。 使用setEntity和setHeader]方法填充请求。 对您的请求使用客户端上的execute方法之一。

  • 如何从设备读取RAW数据?