Java 关于异步任务的建议

Java 关于异步任务的建议,java,android,Java,Android,在本主题中: 我问过onPostExecute如何关闭一个进程,朋友@internal_class7给了我解决错误的方法,但是朋友@Doug Stevenson说用这种方法代码会阻塞uithread,我测试过,这是真的,我的uithread被阻塞了。所以他说我需要使用onPostExecute来获得结果。我阅读并创建了一个代码,我想得到一些建议。 我更改了代码并执行了以下操作: protected ArrayList<String> doInBackground(String...

在本主题中:

我问过onPostExecute如何关闭一个进程,朋友@internal_class7给了我解决错误的方法,但是朋友@Doug Stevenson说用这种方法代码会阻塞uithread,我测试过,这是真的,我的uithread被阻塞了。所以他说我需要使用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(); }
}
受保护的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);
}