Java 关于异步任务的建议
在本主题中: 我问过onPostExecute如何关闭一个进程,朋友@internal_class7给了我解决错误的方法,但是朋友@Doug Stevenson说用这种方法代码会阻塞uithread,我测试过,这是真的,我的uithread被阻塞了。所以他说我需要使用onPostExecute来获得结果。我阅读并创建了一个代码,我想得到一些建议。 我更改了代码并执行了以下操作:Java 关于异步任务的建议,java,android,Java,Android,在本主题中: 我问过onPostExecute如何关闭一个进程,朋友@internal_class7给了我解决错误的方法,但是朋友@Doug Stevenson说用这种方法代码会阻塞uithread,我测试过,这是真的,我的uithread被阻塞了。所以他说我需要使用onPostExecute来获得结果。我阅读并创建了一个代码,我想得到一些建议。 我更改了代码并执行了以下操作: protected ArrayList<String> doInBackground(String...
protected ArrayList<String> doInBackground(String... params) {
try {
final String POST_PARAMS = params[1];
URL obj = new URL(params[0]);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
// For POST only - START
con.setDoOutput(true);
OutputStream os = con.getOutputStream();
os.write(POST_PARAMS.getBytes());
os.flush();
os.close();
// For POST only - END
int responseCode = con.getResponseCode();
System.out.println("POST Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
JSONArray myListsAll= new JSONArray(response.toString());
for(int i=0;i<myListsAll.length();i++){
JSONObject jsonObject = myListsAll.getJSONObject(i);
this.stringArray.add(jsonObject.toString());
}
} else {
System.out.println("POST request not worked");
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return this.stringArray;
}
@Override
protected void onPostExecute(ArrayList<String> result)
{
this.obj.setFeedsData(result);
if(setProgress){ progress.dismiss(); }
}
受保护的ArrayList doInBackground(字符串…参数){
试一试{
最终字符串POST_PARAMS=PARAMS[1];
URL obj=新URL(参数[0]);
HttpURLConnection con=(HttpURLConnection)obj.openConnection();
con.setRequestMethod(“POST”);
con.setRequestProperty(“用户代理”、“Mozilla/5.0”);
//只适用于POST-开始
con.设置输出(真);
OutputStream os=con.getOutputStream();
write(POST_PARAMS.getBytes());
os.flush();
os.close();
//仅适用于POST-结束
int responseCode=con.getResponseCode();
System.out.println(“后响应代码::”+响应代码);
如果(responseCode==HttpURLConnection.HTTP_OK){//success
BufferedReader in=新的BufferedReader(新的InputStreamReader(
con.getInputStream());
字符串输入线;
StringBuffer响应=新的StringBuffer();
而((inputLine=in.readLine())!=null){
追加(inputLine);
}
in.close();
//打印结果
System.out.println(response.toString());
JSONArray myListsAll=新的JSONArray(response.toString());
对于(int i=0;i您所拥有的应该可以正常工作。您在UI线程外正确地执行和解析请求的结果。但是,您可以做一些小事情来让它更清晰
stringArray
看起来像是AsyncTask
上的一个字段。这不是定义AsyncTask
的必要方式,因为您已经将stringArray
直接传递到onPostExecute()中了
method。您应该直接在doInBackground()
方法中声明stringArray
我注意到的另一件事是,根据您在onPostExecute()
中所做的操作,您可能在AsyncTask
中保留对活动的引用。您正在调用this.obj.setFeedsData(result)
。如果您的AsyncTask
是使用它的活动的内部类,您可以直接调用setFeedsData(result);
如果您的AsyncTask
不是内部类,通常最好通过接口将结果传递回感兴趣的对象,以防您需要在其他地方重用AsyncTask
。很好,感谢您的建议,您是对的,我将代码更改为您的建议
@Override
protected void onCreate(Bundle savedInstanceState) {
String[] itensUrl = {links.feedsList(),"iduser=2&offset=0"};
new JsonRequest(this,this,true).execute(itensUrl);
}
public void setFeedsData(ArrayList<String> obj){
createListView(obj);
}