2017-07-30 12 views
-1

これはAsyncTaskクラスのコードです: package com.mermit.enter;asynctaskの結果をメインスレッドに戻す方法

import android.os.AsyncTask; 
import android.os.Bundle; 

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 

public class isOnlineTask extends AsyncTask<Void, Void, Boolean> { 

    public static Boolean networkStatus; 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     /*try { 
      int timeoutMs = 1500; 
      Socket sock = new Socket(); 
      SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53); 

      sock.connect(sockaddr, timeoutMs); 
      sock.close(); 

      return true; 
     } catch (IOException e) { return false; }*/ 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // result holds what you return from doInBackground 
     networkStatus = result; 
    } 
} 

これは私のメインクラスで重要なコードです。関数isOnlineはif文で呼び出され、asynctaskからbooleanを返すことが期待されます。 asynctaskからの応答が返されるまでメインスレッドを待機させたいので、これは私が.get()を使う理由です。私はサイト上でたくさんの質問を見てきましたが、私の特定の状況のた​​めの修正を見つけることができませんでした。 Logcatはエラーメッセージや何か奇妙なものを提供しませんが、これは役に立ちません。

package com.mermit.enter; 

import static com.mermit.enter.isOnlineTask.networkStatus; 

... 

public boolean isOnline() { 
    try { 
     new isOnlineTask().get(); 
     return networkStatus; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

編集:あなたは、UIスレッドの実行を停止しようとするべきではありませんので、私はまた、return new isOnlineTask().execute() 代わり new isOnlineTask().get(); return networkStatus;

答えて

-1

のAsyncTaskは、バックグラウンド動作を行うために使用され を試してみました。 onPostExecute()がUIスレッドで呼び出されるので、ここではタスクの完了後に行う必要があるすべてを行うことができます。あなたは、タスクが完了したかどうか、あなたのメインクラスに知っておく必要がある場合は、私がリスナーを提供することをお勧めこの

isOnlineTask

@Override 
protected void onPostExecute(Boolean result) { 
    MainClass.taskIsCompleted(result) 
} 

MainClass

public class MainClass { 

    private static boolean isTaskCompleted; 

    public void genericMethod() { 
     if(isTaskCompleted()) { 
      // your operation here 
     } 
    } 

    private boolean isTaskCompleted() { 
     return isTaskCompleted; 
    } 

    public static void taskIsCompleted(boolean bool) { 
     isTaskCompleted = bool; 
    } 

} 
+2

..? – EpicPandaForce

0

ような何かを行うことができますオブジェクトをAsyncTaskのコンストラクタに追加し、onPostExecuteコールバックでそれを呼び出します。例えば:その後、

public class isOnlineTask extends AsyncTask<Void, Void, Boolean> { 
    private NetworkStatusListener mListener; 

    public interface NetworkStatusListener{ 
     void isStatusAvailable(Boolean result); 
    } 

    // your code... 
    public isOnlineTask(NetworkStatusListener listener){ 
     this.mListener = listener; 
    } 
    protected void onPostExecute(Boolean result) { 
     // result holds what you return from doInBackground 
     if (mListener != null){ 
      mListener.isStatusAvailable(result); 
     } 
    } 
} 

MainClass上:2017年の静的フィールドとの通信

new isOnlineTask(new NetworkStatusListener{ 
     void isStatusAvailable(Boolean result){ 
      //.. do something with the result 
     } 
    } 
).execute(); 
関連する問題