2012-07-31 68 views
0

我有一個標準的AsyncTask是這樣的:製作的Android/Java代碼更高效 - 刪除重複

// starting AsyncTask in onCreate 
new TaskName().execute(); 


class TaskName extends AsyncTask<String, String, Void> { 
    private ProgressDialog progressDialog = new ProgressDialog(Items.this); 
    private InputStream is = null; 
    private String result = ""; 

    protected void onPreExecute() { 
     progressDialog.setMessage("Loading..."); 
     progressDialog.show(); 

     progressDialog.setOnCancelListener(new OnCancelListener() { 

      public void onCancel(DialogInterface dialog) { 
       TaskName.this.cancel(true); 

      } 
     }); 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     String url_select = "my_link.php"; 

     param = new ArrayList<NameValuePair>(); 
     param.add(new BasicNameValuePair("Category", Category)); 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url_select); 

     try { 
      httpPost.setEntity(new UrlEncodedFormEntity(param)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 

      // read content 
      is = httpEntity.getContent(); 

     } catch (Exception e) { 

      Log.e("log_tag", "Error in http connection " + e.toString()); 
     } 
     try { 
      BufferedReader br = new BufferedReader(
        new InputStreamReader(is)); 
      StringBuilder sb = new StringBuilder(); 
      String line = ""; 
      while ((line = br.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result = sb.toString(); 

     } catch (Exception e) { 
      // TODO: handle exception 
      Log.e("log_tag", "Error converting result " + e.toString()); 
     } 

     return null; 

    } 

    protected void onPostExecute(Void v) { 

     try { 

      JSONArray jArray = new JSONArray(result); 
      JSONObject json_data = null; 
      for (int i = 0; i < jArray.length(); i++) { 
       json_data = jArray.getJSONObject(i); 
       item = json_data.getString("item"); 

       items.add(item); 

      } 
     } catch (JSONException e1) { 
      Toast.makeText(getBaseContext(), "No items!", 
        Toast.LENGTH_SHORT).show(); 
     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } 

     progressDialog.dismiss(); 

    } 
} 

不過,我覺得有三個幾乎相同的AsyncTasks自己做同樣的事情。訪問PHP文件,解析JSON &打印JSON。

我搜索了一段時間,看看有沒有標準的課,我可以使用,但我找不到任何。有沒有辦法讓這個效率更高,所以我不重複這麼多次?

+0

如何啓動AsyncTask,你可以發佈它。 – 2012-07-31 14:28:03

+0

我編輯在頂部,謝謝! – KickingLettuce 2012-07-31 14:29:32

回答

2

也許這會幫助,我不知道這是你問的問題。

我不確定有沒有這樣的事情,但你當然可以開發基於模式的機制。例如,你可以創建一個名爲DoInAsyncTask的接口,它有一個方法doIt。然後讓你的AsyncTask類在其構造函數中使用其中的一個。

然後在onExecute方法中,它只是在傳入它的實例上調用doIt。

然後,將用於解析每個JSON字符串的所有專用代碼放入一組實現DoInAsyncTask接口的不同類中。

然後,您只有一個AsyncTask類,並且所有專用代碼都會進入單獨的解析類,並且當您實例化一個AsyncTask類時,您只需傳入正確的代碼。

很難寫,希望這是有道理的,是你問的。

+0

謝謝,我想我已決定採取不同的方向,使這個過程不必要。但是,儘管我有一個很有創意的答案,但我相信這可能會讓某個人走上正確的道路。 – KickingLettuce 2012-07-31 18:31:05