Android 一个类中的AsyncTask、JSON解析和OnClickListener
我有一个活动,其中我有一个类为HTTP GET请求扩展AsyncTask,然后解析我得到的数据。 问题很简单——onclick不起作用 以下是我代码的一部分:Android 一个类中的AsyncTask、JSON解析和OnClickListener,android,json,multithreading,android-asynctask,onclicklistener,Android,Json,Multithreading,Android Asynctask,Onclicklistener,我有一个活动,其中我有一个类为HTTP GET请求扩展AsyncTask,然后解析我得到的数据。 问题很简单——onclick不起作用 以下是我代码的一部分: public class GetMethod extends AsyncTask<String, Void, String>{ @Override protected String doInBackground(String... urls){
public class GetMethod extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... urls){
BufferedReader in = null;
for (String url : urls) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
try {
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String l = "";
String nl = System.getProperty("line.separator");
while ((l = in.readLine()) != null) {
sb.append(l + nl);
}
in.close();
data = sb.toString();
runOnUiThread(new Runnable() {
public void run() {
JSONObject jObject;
try {
jObject = new JSONObject(data);
//JSONObject object = jObject.getJSONObject("pharms");
JSONArray jArray = jObject.getJSONArray("pharms");
for (int i = 0; i < jArray.length(); i++) {
name = jArray.getJSONObject(i).getString("name").toString();
phone = jArray.getJSONObject(i).getString("phone").toString();
latitude = jArray.getJSONObject(i).getString("latitude").toString();
longitude = jArray.getJSONObject(i).getString("longitude").toString();
address = jArray.getJSONObject(i).getString("address").toString();
RelativeLayout ll2 = new RelativeLayout(context);
//ll2.setOrientation(Orientation.ho)
*** Create button named call ***
call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:123456789"));
startActivity(callIntent); //// This function doesn't work
}
});
ll2.addView(call);
*** Create textview named tv ***
ll2.addView(tv);
ll.addView(ll2);
}
}
公共类GetMethod扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
BufferedReader in=null;
for(字符串url:url){
HttpClient=new DefaultHttpClient();
HttpGet请求=新的HttpGet(url);
试一试{
HttpResponse response=client.execute(请求);
in=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent());
StringBuffer sb=新的StringBuffer(“”);
字符串l=“”;
字符串nl=System.getProperty(“line.separator”);
而((l=in.readLine())!=null){
sb.追加(l+nl);
}
in.close();
data=sb.toString();
runOnUiThread(新的Runnable(){
公开募捐{
JSONObject jObject;
试一试{
jObject=新的JSONObject(数据);
//JSONObject object=jObject.getJSONObject(“pharms”);
JSONArray jArray=jObject.getJSONArray(“pharms”);
for(int i=0;i
很难说发生了什么。如果您使用的是异步任务,则代码中不明显
AsyncTask和其他后台线程操作应仅在后台进行,但在极少数情况下除外。它们应是异步的;当后台线程正在执行其工作时,用户会去做其他事情或等待片刻。尝试从后台操纵UI通常不会正常工作
如果您正在执行HTTP GET请求,您应该让它将JSON解析到持久存储中,然后在解析完成后返回前台。然后您可以对数据执行操作。还请记住,如果需要重新创建活动,异步任务将被取消。如果用户意外丢弃设备,它可能会从纵向模式变为横向模式并在异步任务完成之前销毁它。最好使用IntentService,它将继续运行
我不能肯定地说,因为我不知道你想完成什么。试着解释一下我在做什么。我有一个服务器,上面有数据。数据是,例如,药店的名单,有名称、电话、地址等。通过GET请求,我得到这些数据,并用JSON解析。它可以工作。直到我添加以下内容:RunNuithRead,它才起作用(新建Runnable(){public void run())然后,我为数组的每一项创建TextView和Button。在TextView name和phone中。当用户按下按钮时,它将在此手机上被调用。一旦单击这些按钮不起作用,您就不应该在doInBackground中执行与UI相关的操作,因为它与主线程异步运行并更新UI。因此,最好o除了在
doInBackground()
中之外,在onPostExecute()
方法中执行UI操作。只需在doInBackground()中解析Json,然后在onPostExecute中更新UI。