2016-05-10 14 views
0

私の活動では、スレッドを使用してサーバを呼び出し、内部ストレージに置くXML応答を受信します。Androidで非同期タスクを管理する方法

この呼び出しの後、このxmlファイルを読み込んで解析し、このxmlファイルに関する情報をユーザーに表示しますが、このファイルをInputStreamに追加すると、このInputStreamはnullになります。

私の活動は単純な実行を続け、私のInputStreamを作成するときに私のxmlファイルが存在しないので、スレッドを待ちません。

私は私のプログラムの実行に対応し、このスキーマを作った:私の活動は私のスレッドの終了を待つことができますどのように

Schema here

?私はこれが主要な活動を凍結するのは良いことではないことを知っていますが、私はどのようにできるのか分かりません。 スレッド上のオブザーバーをスレッドの最後まで追加することはできますか?

PS:私のスレッドは************* *************/

最初のソリューションで編集/ Runnableを

を実装あなたの応答のためにすべてのおかげで、私は多くの進歩をさせる。

//In my Activity 

MyAsyncTask asyncTask = new MyAsynctask(); 
asynctask.execute(); 

//My Async class 
public class MyAsynctask extends AsyncTask<Void,Void,Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Toast.makeText(getApplicationContext(), "calling server...", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     //Instance of calling class 
     //Method of this instance to call the server and create a file in internal storage 
     //After that my file is stored with the server response 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void result){ 
     super.onPostExecute(result); 

     Toast.makeText(getApplicationContext(), "Data received", Toast.LENGTH_LONG).show(); 

     FileInputStream inputStream = null; 
     inputStream = openFileInput("myFile");      

     data=XMl.parse(inputStream);     
    } 
} 

私はこの投稿をお待ちしており、あなたの回答は役に立ちます。

+0

[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html) – Titus

+0

私が非同期タスクを使用する場合は、スレッドを作成する必要はありません。私のasyncTaskにすべてのリクエストメソッドを入れますか? – Swodniw

+0

'AsyncTask'はバックグラウンドスレッドを作成し、タスクが完了したときにメインスレッド上で実行されるコールバック' onPostExecute(...) 'を持っています。 – Titus

答えて

0
public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      new DownloadfromInternet().execute(server_url); 

     } 

//非同期タスククラス クラスDownloadFromInternetは、実行の終わりまでAsyncTaskあなたの活動待ちを作る{

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Shows Progress Bar Dialog and then call doInBackground 
    } 

    // Download File from Internet 
    @Override 
    protected String doInBackground(String... f_url) { 

     try { 
     //make server call and store file in local 
     } catch (Exception e) { 
      Log.e("Error: ", e.getMessage()); 
     } 
     return LOCAL_FILE_NAME; 
    } 


    @Override 
    protected void onPostExecute(String local_file_url) { 
     // read local_file_url 

    } 
} 
+0

私はこれを試してみます – Swodniw

+0

自分のアクティビティに自分のAsyncTaskを作成する必要がありますか?私のコードの残りの部分の下で – Swodniw

+0

はい... AsyncTaskはあなたのアクティビティにあります。あなたの質問を編集し、そこにコードを書いてください。 –

0

また、AsnycTaskを使用すると、使用例に適していると思います。

を実行して、onPostExecuteの応答の読み取りと解析を続行できます。

乾杯! :D

+0

あなたの助けてくれてありがとう、今まで私はスレッドを使用して、私はAsyncTaskを使用したことがない。 – Swodniw

+0

一度それを取得すると、それは非常に簡単です。ハッピーコーディング。乾杯! :D –

0

Activity(またはFragmentなど)でのようにAsyncTaskを使用します。通常、別の活動にAsyncTaskを簡単に再利用を行うためAsyncResponseインターフェイスを実装I は:あなたの代わりにexecuteOnExecutorの)m.executeを(使用していて、同時に複数のAsyncTaskを持っている場合は

MyAsyncTask m = new MyAsyncTask(randomparameters, new AsyncResponse(){ 
       @Override 
       public void onSuccess(Object result) { 
        // Success!! do what you want 
       } 

       @Override 
       public void onError() { 
        // Manage errors here 
       } 
      }); 
    m.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

彼らがあれば、sequentally実行します並列実行するエグゼキュータを使用します。あなたが欲しいものや必要とするものを行います。

public interface AsyncResponse { 

    void onSuccess(Object result); 
    void onError(); 

} 

AsyncTaskクラス、それはなどあなたがonPreExecuteのように上書きすることができ、他の方法を持っている

public class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> { 

    private AsyncResponse response; 

    public MyAsyncTask(randomparameters, AsyncResponse response) { 
     // Constructor 
     this.response = response; 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     // Implements your async code (call your server) 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
      if (result) { 
       // Here you can return the response of the server to the activity 
       response.onSuccess(response); 
      } else { 
       response.onError(); 
      } 
     } 
    } 

そしてここでは、インターフェース(もちろん、あなたが方法をカスタマイズすることができます)です

AsyncResponseのインターフェースはオプションですが、私はいつもそれを実装してくれています。

+0

私は助言をしようとしています。 – Swodniw

+0

この問題を実装する際に問題が発生した場合、非同期タスクはスレッドよりも優れた目的のための最良の方法です。それが動作すれば、答えは受け入れられたものにします。 –

0

を拡張し、それは、UIスレッドを凍結するよう、良いアイデアではありません。タスクが長すぎる場合はANRがスローされます。

  1. 非同期タスク を実行するために必要なパラメータや条件を作成し、それを呼び出し、非同期タスクを提供し、あなたの 活動の内部クラスがあり、ある操作を、残りの操作を行います。 あなたは2つの選択肢を持っています 非同期タスクに依存するため、非同期タスクのonPostExecuteコールバックが発生します。

  2. の結果を実装クラスに非同期タスクから伝えるのに役立つメソッドを持つインターフェイスを作成します。これは、外部クラスとしての非同期タスクのテストおよび/または作成のための最も良い方法です。 私は そのアプローチをかなりたくさん使っています。あなたの非同期タスクで、public メソッドを定義して、インターフェイスにリスナーを設定してください。 インターフェイスを実装してください。非同期タスクが完了したら、 onPostExecuteで、listenerがnullでない場合は、インターフェイスメソッドを呼び出します。 でアクティビティで実装されたメソッドでは、 非同期タスクの結果に関連するロジックを実装します。

非同期タスク用のインターフェイスコールバックを設定することは、テストを使用する場合は常に良い考えです。

0

私の活動は単純な実行を続けると思いますので、私のInputStreamを作成するときに私のxmlファイルは存在しません。

- 正しい

Iあなたの場合、私はあなたが要求を発射したときに読み込みダイアログを起動できることを示唆しています。応答を受け取ったら、その結果をUIスレッドで実行されているハンドラに送信し、handleMessageメソッドをオーバーライドします。ここでダイアログを閉じて情報を表示します。

、またはAsynTaskを使用すると便利です。

関連する問題