Android 一个类中的AsyncTask、JSON解析和OnClickListener

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){

我有一个活动,其中我有一个类为HTTP GET请求扩展AsyncTask,然后解析我得到的数据。 问题很简单——onclick不起作用

以下是我代码的一部分:

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。