0

我有一个活动,其中我有一个类扩展 AsyncTask 用于 HTTP GET 请求,然后解析我得到的数据。问题很简单——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);
                        }  
                        }
4

1 回答 1

0

很难说发生了什么。如果您使用的是 AsyncTask,则从代码中并不明显。

AsyncTask 和其他后台线程操作应该只在后台运行,除非在极少数情况下。它们是异步的;当后台线程在做它的工作时,用户去做别的事情或者等待片刻。尝试从后台操作 UI 通常不会成功。

如果您正在执行 HTTP GET 请求,您应该让它将 JSON 解析为持久存储,然后在完成后返回前台。然后,您可以对数据采取行动。还要记住,如果需要重新创建 Activity,则会取消 AsyncTask。如果用户不小心掉落了设备,它可能会从纵向模式变为横向模式,并在完成之前破坏您的 AsyncTask。使用 IntentService 可能会更好,它将继续运行。

我不能肯定地说,因为我不知道你想要完成什么。

于 2013-09-16T21:31:40.440 回答