2017-03-10 11 views
2

私は非同期タスクについてあまり知らないので、私の質問がとても基本的であれば申し訳ありません。
私のデータベースからいくつかのデータをダウンロードしてリストビューで表示するAsyncTaskクラスがあります。
私の実行中のタスクを含む私のフラグメントは、フラグメントが再起動するたびにロード進捗状況を表示します。これは少し面倒です..
..非同期タスク結果を保存

ダウンロードタスクは、(setUserVisibleHint方法で)私のフラグメントで始まる結果を保存し、そこから私のリストビューに表示し... そしてこのたびアプリが再起動を繰り返ししかし、私: は、だから私はこれを行うことを決めましたあなたは私にちょうどヒントを与えることができる場合、私は非常に感謝します。

これは私のAsyncTaskクラスです:

public class RingBankAsyncTask extends AsyncTask<String, Void, String> { 
    private ProgressDialog progressDialog; 
    private AsyncResponse delegate; 
    private Context context; 
    private HashMap<String, String> postData = new HashMap<String, String>(); 
    private String loadingMessage = "Loading..."; 
    private boolean showLoadingMessage = true; 

    public RingBankAsyncTask(Context context, AsyncResponse delegate) { 
    this.delegate = delegate; 
    this.context = context; 
    } 

    public RingBankAsyncTask(Context context, boolean showLoadingMessage, AsyncResponse delegate) { 
    this.delegate = delegate; 
    this.context = context; 
    this.showLoadingMessage = showLoadingMessage; 
    } 

    public RingBankAsyncTask(Context context, HashMap<String, String> postData, AsyncResponse delegate) { 
    this.context = context; 
    this.postData = postData; 
    this.delegate = delegate; 
    } 

    public RingBankAsyncTask(Context context, HashMap<String, String> postData, boolean showLoadingMessage, AsyncResponse delegate) { 
    this.context = context; 
    this.postData = postData; 
    this.delegate = delegate; 
    this.showLoadingMessage = showLoadingMessage; 
    } 

    public RingBankAsyncTask(Context context, String loadingMessage, AsyncResponse delegate) { 
    this.context = context; 
    this.loadingMessage = loadingMessage; 
    this.delegate = delegate; 
    } 

    public RingBankAsyncTask(Context context, HashMap<String, String> postData, String loadingMessage, AsyncResponse delegate) { 
    this.context = context; 
    this.postData = postData; 
    this.loadingMessage = loadingMessage; 
    this.delegate = delegate; 
    } 

    protected void onPreExecute() { 
    if (this.showLoadingMessage == true) { 
     this.progressDialog = new ProgressDialog(this.context); 
     this.progressDialog.setMessage(this.loadingMessage); 
     this.progressDialog.show(); 
    } 

    super.onPreExecute(); 
    } 

    protected String doInBackground(String[] urls) { 
    String result = ""; 

    for (int i = 0; i <= 0; i++) { 
     result = invokePost(urls[i], this.postData); 
    } 

    return result; 
    } 

    private String invokePost(String requestURL, HashMap<String, String> postDataParams) { 
    String response = ""; 
    try { 
     URL url = new URL(requestURL); 

     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     conn.setReadTimeout(15000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("POST"); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 

     OutputStream os = conn.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 

     writer.write(getPostDataString(postDataParams)); 

     writer.flush(); 
     writer.close(); 
     os.close(); 
     int responseCode = conn.getResponseCode(); 

     if (responseCode == 200) { 
     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = br.readLine()) != null) 
      response = new StringBuilder().append(response).append(line).toString(); 
     } 
     else { 
     response = ""; 

     Log.i("RingBankAsyncTask", new StringBuilder().append(responseCode).append("").toString()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return response; 
    } 

    private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 

    for (Map.Entry entry : params.entrySet()) { 
     if (first) 
     first = false; 
     else { 
     result.append("&"); 
     } 
     result.append(URLEncoder.encode((String)entry.getKey(), "UTF-8")); 
     result.append("="); 
     result.append(URLEncoder.encode((String)entry.getValue(), "UTF-8")); 
    } 

    return result.toString(); 
    } 

    protected void onPostExecute(String result) { 
    if ((this.showLoadingMessage == true) && 
     (this.progressDialog.isShowing())) { 
     this.progressDialog.dismiss(); 
    } 

    result = result.trim(); 

    this.delegate.processFinish(result); 
    } 

    public String getLoadingMessage() { 
    return this.loadingMessage; 
    } 

    public void setLoadingMessage(String loadingMessage) { 
    this.loadingMessage = loadingMessage; 
    } 
    public HashMap<String, String> getPostData() { 
    return this.postData; 
    } 
    public void setPostData(HashMap<String, String> postData) { 
    this.postData = postData; 
    } 

    public Context getContext() { 
    return this.context; 
    } 

    public AsyncResponse getDelegate() { 
    return this.delegate; 
    } 
} 

そして、私はこのようにそれを呼び出す:

RingBankAsyncTask task = new RingBankAsyncTask(getActivity(), this); 
    task.execute(myUrl); 
+0

10秒ごとにデータを表示するか、最初にデータを表示したいですか? –

+0

フラグメントが表示されているときにデータを表示したいときに、フラグメントを再起動するたびにタスクを実行したくない – Mehran

+0

結果として、StringBuilderまたはこのコードの結果を意味しますか? – SanVed

答えて

1

あなたはアプリがOTない初めて開かれているかどうかを確認するチェックする必要があります。あなたのアプリが起動したとき

  SharedPreferences sharedpreferences =.getSharedPreferences("CHEKINGFIRST", Context.MODE_PRIVATE); 

    first= sharedpreferences12.getString("FIRST", ""); 
    if(!first.equal("second")){ 
    RingBankAsyncTask task = new RingBankAsyncTask(getActivity(), this); 
task.execute(myUrl); 
SharedPreferences sharedPreferencess=getActivity().getSharedPreferences("CHEKINGFIRST", Context.MODE_PRIVATE); 
        SharedPreferences.Editor editor1=sharedPreferencess.edit(); 
        editor1.putString("FIRST","second"); 
        editor1.commit(); 

       } 
+0

あなたのコードがどこにあるかを確認する必要があるアクティビティやコンテキストを取得する –

+0

これは役に立ちます –

0

、ちょうどSharedPreferencesを使用して、いくつかのフラグfalseを設定します。最初にAsyncTaskを呼び出してSharedPreferencesflagをtrueにして、flagfalsetrueかどうかをアプリが起動するたびにチェックします。 フラグメントの詳細を制御できるもう1つのことは、setRetainInstance(true)をフラグメントのonActivityCreatedに使用すると、fragmentコンフィグレーションを変更しながらフラグメントインスタンスを保持するのに役立ちます。