【问题标题】:Problem with using httpclient for fetching data使用 httpclient 获取数据的问题
【发布时间】:2020-03-02 15:53:52
【问题描述】:

我想在我的 android 应用程序中使用 httpclient。我知道这个库很久以前就被弃用了,但出于某种原因我想使用它。当我编写一些代码从 URL 获取 JSON 数据时,模拟器会获取我这个:image

这是我的代码:

public class FirstExampleActivity extends AppCompatActivity {

TextView tv ;
public static final String URL = "http://androidtestapp.gigfa.com/mysite/guitarist.json";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_example);

    tv = findViewById(R.id.tv);
}

@Override
public boolean onCreateOptionsMenu(final Menu menu) {

    MenuItem item = menu.add("GET");
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {

            Thread thread = new Thread(new Runnable() {

                Handler handler = new Handler(){

                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        String content = msg.getData().getString("content");
                        tv.setText(content);
                    }
                };

                @Override
                public void run() {
                    String content = getData();
                    Message message = new Message();
                    Bundle bundle = new Bundle();
                    bundle.putString("content",content);
                    message.setData(bundle);
                    handler.sendMessage(message);
                }
            });
            thread.start();
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

private String getData() {

    HttpClient client = new DefaultHttpClient();
    HttpGet method = new HttpGet(URL);
    try{
        HttpResponse response = client.execute(method);
        InputStream stream = response.getEntity().getContent();
        String content = Utils.inputStreamToString(stream);
        return content ;
    }
    catch (Exception ex){
        ex.printStackTrace();
    }
    return null ;
}
}

【问题讨论】:

  • 看起来你的帖子主要是代码;请添加更多细节。我想你一开始就明白这一点,但你还是忽略了这一点?
  • 首先我推荐使用 Retrofit 或 Volley 进行网络请求,但是如果你想使用 Android 库你可以在这里查看:developer.android.com/reference/java/net/HttpURLConnection

标签: android androidhttpclient


【解决方案1】:

我相信这个answer 可以帮助你。问题是一些网站起初会返回一些 javascript,例如出于验证目的,但 httpclient 不支持 javascript。

【讨论】:

    【解决方案2】:

    下面的sn-p就足够了:

    public class FirstExampleActivity extends AppCompatActivity {
    
       public static final String URL = "http://androidtestapp.gigfa.com/mysite/guitarist.json";
       TextView tv;
       private static final String TAG = FirstExampleActivity.class.getSimpleName();
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           tv = findViewById(R.id.tv);
       }
       @Override
       public boolean onCreateOptionsMenu(final Menu menu) {
    
           MenuItem item = menu.add("GET");
           item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
           item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
               @Override
               public boolean onMenuItemClick(MenuItem item) {
    
                   Thread thread = new Thread(new Runnable() {
    
                      Handler handler = new Handler() {
    
                           @Override
                           public void handleMessage(Message msg) {
                               super.handleMessage(msg);
                               final String content = msg.getData().getString("content");
                               tv.setText(content);
                           }
                       };
    
                       @Override
                       public void run() {
                           String content = getData();
                           Message message = new Message();
                           Bundle bundle = new Bundle();
                           bundle.putString("content", content);
                           message.setData(bundle);
                           handler.sendMessage(message);
                       }
                   });
                   thread.start();
                   return false;
               }
           });
           return super.onCreateOptionsMenu(menu);
      }
    
      private String getData() {
    
          URL client;
          HttpURLConnection urlConnection = null;
          try {
              client = new URL(URL);
              urlConnection = (HttpURLConnection) client.openConnection();
              urlConnection.setRequestMethod("GET");
              int responseCode = urlConnection.getResponseCode();
    
              if (responseCode == HttpURLConnection.HTTP_OK) { // connection ok
                  BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                  String inputLine;
                  StringBuilder response = new StringBuilder();
                  while ((inputLine = in.readLine()) != null) {
                      response.append(inputLine);
                  }
                  in.close();
                  return response.toString();
              }
          } catch (IOException exc) {
              Log.e(TAG, "exception:" + exc);
          } finally {
              if(urlConnection!=null){
                  urlConnection.disconnect();
              }
          }
          return null;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2013-10-08
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多