我们怎么能等待HttpURLConnection完成

时间:2018-01-18 09:29:26

标签: android android-asynctask

我想创建一个Web连接器类。

我从不希望这个类设置文本来查看控制器。

我希望这个类只是尝试请求web然后返回字符串。

MyTest.java

public class MyTest {

    private String sUrl = "http://Secret";
    public String sRequestMethod;

    public String sResult;

    public String GetWebApi(final BaseRequest oRequest)
    {
      new Thread(new Runnable() {
        @Override
        public void run() {
          try {
            URL url = new URL(sUrl);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod(oRequest.GetHttpMethod());
            String str = InputStreamToString(con.getInputStream());

          } catch(Exception ex) {
            System.out.println(ex);
          }
        }
      }).start();

      return sResult;
    }

    private String InputStreamToString(InputStream is) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      StringBuilder sb = new StringBuilder();
      String line;
      while ((line = br.readLine()) != null) {
        sb.append(line);
      }
      br.close();

      sResult = sb.toString();

      return sb.toString();
    }
  }

Home.java

public class Home extends Fragment {

      public Home() {
        // Required empty public constructor
      }

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false);
      }


      @Override
      public void onStart() {
        super.onStart();

        Button btn = getActivity().findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            LoginRequest oLoginRequest = new LoginRequest();
            MyTest tt = new MyTest();
            TextView tv = getActivity().findViewById(R.id.tv);
            tv.setText(tt.GetWebApi(oLoginRequest));
          }
        });
      }
}

使用HttpUrlConnection获得响应是成功的。

但是这个程序不等待完成GetWebApi方法。

只需拨打GetWebApi - >做tv.setText(),所以null设置为tv。

你有什么想法。谢谢。

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用AsyncTask替换Thread课程中的MyTest

这将处理在后台发出请求和等待结果之间的协调,以便您可以更新UI。

只需移动逻辑即可执行您的请求,并将结果解析为doInBackground(),然后在onPostExecute()更新您的用户界面。

答案 1 :(得分:0)

由于我想要异步运行网络内容,这就是我想要编写GetWebApi方法的方法:

create table tempschema.temp_test_staging (like tempschema.temp_test);
insert into tempschema.temp_test_staging
select *
from (
    select ad_id, id_type, lat, long,
    Row_Number() over(partition by ad_id,id_type, lat, long) AS duplicate_count
    from tempschema.temp_test
)
where duplicate_count=1;
alter table tempschema.temp_test rename to temp_test_old;
alter table tempschema.temp_test_staging rename to temp_test;

现在收到请求的结果;

public void GetWebApi(final BaseRequest oRequest)
    {
      new Thread(new Runnable() {
        @Override
        public void run() {
          try {
            URL url = new URL(sUrl);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod(oRequest.GetHttpMethod());
            String str = InputStreamToString(con.getInputStream());
            Intent in = new Intent(Constants.NETWORK_RESULT);
            in.putExtra(Constants.VALUE, str);
            getContext().sendBroadcast(in);
          } catch(Exception ex) {
            System.out.println(ex);
          }
        }
      }).start();

}

然后在onStart方法中注册接收器:

private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getStringExtra(Constants.VALUE)!=null) {
                tv.setText(intent.getStringExtra(Constants.VALUE))            }
        }
    };

这也可以在AsyncTask中完成,也就是说你不介意。