2016-02-28 3 views
1

В этой теме: About task onPostExecuteПредложение о AsyncTask

Я спросил о onPostExecute уволить процесс, друг @ inner_class7 дать мне способ решить эту ошибку, но друг @Doug Стивенсон сказал, что использование таким образом код будет блокировать 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(); } 
} 

Так называют в моем mainactivity:

@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

Что вы должны работать, просто отлично. Вы правильно выполняете и разбираете результаты запроса с потока пользовательского интерфейса. Однако есть несколько второстепенных вещей, которые вы можете сделать, чтобы сделать их более ясными.

stringArray похоже на поле на AsyncTask. Это не обязательно так, как у вас есть AsyncTask, так как вы уже передаете stringArray непосредственно в метод onPostExecute(). Вместо этого вы должны объявить stringArray непосредственно в методе doInBackground().

Другая вещь, которую я заметил, похоже, что вы можете хранить ссылку на ваш Activity в AsyncTask на основе того, что вы делаете в onPostExecute(). Вы звоните this.obj.setFeedsData(result);. Если ваш AsyncTask является внутренним классом Activity, используя его, вы можете позвонить setFeedsData(result); прямо.

Если ваш AsyncTask не является внутренним классом, обычно лучше передать результаты обратно интересующему их объекту через интерфейс, если вам нужно повторно использовать AsyncTask в другом месте.

+0

Хорошо, благодаря предложению, вы правы, я поменял свой код на ваше предложение –

Смежные вопросы