我想创建一个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。
你有什么想法。谢谢。
答案 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中完成,也就是说你不介意。