关于AsyncTask的建议

时间:2016-02-28 17:18:48

标签: java android

在本主题中: About task onPostExecute

我问onPostExecute要解雇一个进程,朋友@ inner_class7给我解决错误的方法,但朋友@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(); }
}

请致电我的主要活动:

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

那你觉得怎么样?这种使用方式是一种好方法吗?

1 个答案:

答案 0 :(得分:1)

你所拥有的应该工作得很好。您正在从UI线程正确执行和解析请求的结果。但是,您可以采取一些小的措施来使其更加清晰。

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

我注意到的其他事情是,您可能会根据您在Activity中的操作,在AsyncTask中保留对onPostExecute()的引用。您正在呼叫this.obj.setFeedsData(result);。如果您的AsyncTaskActivity使用它的内部类,则可以直接致电setFeedsData(result);

如果您的AsyncTask不是内部类,通常最好通过接口将结果传递回对其感兴趣的对象,以防您需要在其他地方重用AsyncTask