2016-08-21 4 views
3

AsyncTaskを使用してUIをフリーズさせないためにバックグラウンドスレッドでたくさんのコードを実行しています。 AsyncTaskの結果はOKで、その結果をonPostExecuteで使用できます。 しかし、asyncTaskを初期化して実行した後のAsyncTaskの外側は、バックグラウンドスレッド上にあるため、結果にアクセスできません。例AsyncTaskが完了するまで、ゲッターまたは通常のメソッドを待つ方法

ファーストクラスで
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

MyObject mObject = new Myobject(getApplicationContext()); 
mObject.getStart(); 
mObject.getResult(); 

} 

public class MyObject extends Parent{ 

    Context context; 

    public MyObject (Context context, long startTimeStamp) { 
     super(); 
     this.context = context; 
     setStart(startTimeStamp); 

      MyAsyncTask async = new MyAsyncTask(); 
      async.execute(""); 

    } 

    private Object myTestMethod() { 

     if(true) 
     return true; 

     return false; 
    } 

    private class MyAsyncTask extends AsyncTask<String, Void, Object> { 
     @Override 
     protected Object doInBackground(String... strings) { 

      return myTestMethod(); 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      setResult(o); 
     } 

    } 

} 

public class Parent{ 

private long start; 
private Object result; 


public long getStart() { 
    return start; 
} 

public void setStart(long start) { 
    this.start = start; 
} 

public Object getResult() { 
    return result; 
} 

public void setResult(Object result) { 
    this.result = result; 
} 
} 

ため 私はそれがのStartTimeを返すスーパークラスからgetStart()を呼び出し、良いを動作しますが、ときに私に電話するAsyncTaskは背景で働いているので、、それはヌルを返し、私が検索し、このしかし

try { 
     MyAsyncTask async = new MyAsyncTask(); 
     setResult(async.execute().get()); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

それは待ってフォアグラウンドを凍結しますを発見しました。

AsyncTaskは、タスクを完了するまで待機し、その後、結果 または任意の他の提案 を返すために、私のセッターメソッドのいずれかの解決策がある場合の例は不明であったならば、私は

を聞いて喜んでいますが、明確にするために私をコメント

答えて

-2

これはasyncTaskの目的を無効にしませんか?非同期タスクの目的は、処理作業をバックグラウンドスレッドに延期し、その結果を非同期にメインスレッドにコールバックさせることです。

MyObject mObject = new Myobject(getApplicationContext()); 
mObject.getStart(); 
mObject.getResult(); 

上記を実行することで、すでに同期しています。そして、私はオブジェクトのコンストラクタにaynctaskを埋め込むことは賢明ではないと思います。私が示唆しているのは、オブジェクトの外部で非同期タスクを実行し、オブジェクトフィールドをポピュレートしてポスト実行にパラメータとして渡すことです。

+0

回答ありがとうございます。 私はすでにこれを知っていました。 私の質問は、私の 'getResult()'が言っている方法はありますか?バックグラウンドプロセスがマルチスレッドのように動作するまで停止しますか? もしあなたが私の 'getResult()'を呼び出すときに何を示唆していなければ、私はnullであってはいけません! – Martin

+0

私が考えることができる唯一の事は単純なヌルチェックです。 – kyo171

関連する問題