gpt4 book ai didi

java - 关于 AsyncTask 的建议

转载 作者:行者123 更新时间:2023-11-30 01:31:36 26 4
gpt4 key购买 nike

在本主题中: About task onPostExecute

我问了关于onPostExecute dismiss a process的问题, friend @inner_class7给了我解决错误的方法,但是 friend @Doug Stevenson说这样代码会阻塞uithread,我测试是这样的,我的 uithraed 被屏蔽了。所以他说我需要使用 onPostExecute 来获取结果。我阅读并创建了一个代码,我想就此提出建议。我更改了代码并执行了:

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(); }
}

所以调用我的主要 Activity :

@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);
}

那你怎么看?这种方式使用是一种好方式吗?

最佳答案

你所拥有的应该工作得很好。您正在 UI 线程之外正确执行和解析请求的结果。但是,您可以做一些小的事情来让它更清楚。

stringArray 看起来像 AsyncTask 上的一个字段。这不是您定义 AsyncTask 的方式所必需的,因为您已经将 stringArray 直接传递到 onPostExecute() 方法中。您应该直接在 doInBackground() 方法中声明 stringArray

我注意到的另一件事是,根据您在 onPostExecute() 中所做的事情,您可能会在 AsyncTask 中保留对您的 Activity 的引用。您正在调用 this.obj.setFeedsData(result);。如果您的 AsyncTask 是使用它的 Activity 的内部类,您可以直接调用 setFeedsData(result);

如果您的 AsyncTask 不是内部类,通常最好通过接口(interface)将结果传回对它们感兴趣的对象,以防您需要重用 AsyncTask 别处。

关于java - 关于 AsyncTask 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35685688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com