我正在尝试根据从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)
提前谢谢。
在run()方法中将数据从服务器解析到本地数组,然后将数组传递给适配器,并将适配器设置为ListView,但在单独的UI线程中,不能从非UI线程更新UI。
下面是一个如何使用处理程序解析数据并将其加载到ListView的示例。
另一种方法是使用runOnUiThread()。
如果您在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数据?