2017-04-20 5 views
0

私のシナリオでは、スプラッシュアクティビティで5スレッドの並列コールが発生しますが、ダッシュボードをロードできるように1つの特定のスレッド(DashBoardCallable)のエクステンションを待つ必要がありますデータは、ダッシュボードデータがロードされるまでスプラッシュ画面を表示し、ダッシュボードデータがロードされると同時にアクティビティを変更します。同時に、そのユーザーに関連するいくつかのデータをバックグラウンドで読み込みます(スレッドユーティリティクラスが行います)。アンドロイドのスプラッシュスクリーンでコール可能なコールを待つ方法

これを理解すると、5つのスレッドからなるExecutorServiceが並列呼び出しに使用され、Splashscreenは5から1つのスレッド実行に基づいています。このスレッドの実行が完了すると、他のスレッドの実行はバックグラウンドで残ります。これはthreadUtilクラスです

public class DashBoardCallable implements Callable<String> { 
    private Context context; 
    private int user_id; 
    public DashBoardCallable(Context context,int user_id){ 
     this.context = context; 
     this.user_id = user_id; 
    } 

    @Override 
    public String call() throws Exception { 
     HttpUtil httpUtil = new HttpUtil(); 

     httpUtil.setUrl("URL"); 
     httpUtil.setType("GET"); 

     return httpUtil.getStringResponse(); 
    } 
} 

::これは呼び出し可能dashboaordが

ExecutorService executor = Executors.newFixedThreadPool(5); 

      SharedPreferences  sharedpreferences = getSharedPreferences(getResources().getString(R.string.mypreference_key), Context.MODE_PRIVATE); 
      final SharedPreferences.Editor editor = sharedpreferences.edit(); 
      ThreadUtil datatype1 = new ThreadUtil(editor,3504,"URL","DATATYPE1","DATATYPE1"); 
      ThreadUtil datatype2 = new ThreadUtil(editor,3504,"URL","DATATYPE2","DATATYPE2"); 
      ThreadUtil datatype3 = new ThreadUtil(editor,3504,"URL","DATATYPE3","DATATYPE3"); 
      ThreadUtil datatype4 = new ThreadUtil(editor,3504,"Different URL","DATATYPE1","DATATYPE1"); 
        DashBoardCallable dashBoardCallable = new DashBoardCallable(SplashScreenActivity.this,3504); 
    FutureTask<String> dashboardFuture = new FutureTask<String>(dashBoardCallable); 
      executor.execute(datatype1); 
      executor.execute(datatype2); 
      executor.execute(datatype3); 
      executor.execute(datatype4); 
executor.execute(dashboardFuture); 
      String response =dashboardFuture.get(); 

である:以下

スプラッシュアクティビティコードである

public class ThreadUtil implements Runnable { 
    private int user_id; 
    private String url,type,stored_name; 
    private SharedPreferences.Editor editor; 
    public ThreadUtil(SharedPreferences.Editor editor, int user_id, String url, String type,String stored_name){ 
     this.editor = editor; 
     this.user_id = user_id; 
     this.url = url; 
     this.type = type; 
     this.stored_name = stored_name; 
    } 

    @Override 
    public void run() { 
     HttpUtil httpUtil = new HttpUtil(); 
     httpUtil.setUrl(url); 
     httpUtil.setType("GET"); 
     String jsonresponse =httpUtil.getStringResponse(); 
     Gson gson = new Gson(); 
     switch (type){ 
      case "DATATYPE1": 
       saveDATATYPE1(jsonresponse,gson,editor); 
       break; 
      case "DATATYPE2": 
       saveDATATYPE2(jsonresponse,gson,editor); 
       break; 
      case "DATATYPE3": 
       saveDATATYPE3(jsonresponse,gson,editor); 
       break; 
     } 


    } 

    private void saveDATATYPE1(String jsonresponse, Gson gson,SharedPreferences.Editor editor) { 
     if(!jsonresponse.equalsIgnoreCase("null")){ 
      editor.putString(stored_name, jsonresponse); 
      editor.apply(); 
      editor.commit(); 
     } 
    } 

    private void saveDATATYPE2(String jsonresponse, Gson gson, SharedPreferences.Editor editor) { 
     try { 
      Type listType = new TypeToken<List<AssessmentPOJO>>() {}.getType(); 
      ArrayList<AssessmentPOJO> dashboardCards = (ArrayList<AssessmentPOJO>) gson.fromJson(jsonresponse, listType); 
      for(AssessmentPOJO assessmentPOJO:dashboardCards){ 
       System.out.println("XXBBXBXBXBXB -> "+assessmentPOJO.getName()); 
       if(assessmentPOJO != null){ 
        editor.putString(stored_name+assessmentPOJO.getId(), gson.toJson(assessmentPOJO)); 
        editor.apply(); 
        editor.commit(); 
       } 
      } 
     }catch (JsonSyntaxException jse){ 
      jse.printStackTrace(); 
     }catch (Exception e){ 

     } 
    } 
    private void saveDATATYPE3(String jsonresponse, Gson gson,SharedPreferences.Editor editor) { 
     if(!jsonresponse.equalsIgnoreCase("null")) { 
      Type listType = new TypeToken<List<CoursePOJO>>() {}.getType(); 
      ArrayList<CoursePOJO> coursePOJOs = (ArrayList<CoursePOJO>)gson.fromJson(jsonresponse, listType); 
      for(CoursePOJO coursePOJO:coursePOJOs){ 
       if(coursePOJO != null){ 
        editor.putString(stored_name+coursePOJO.getId(), gson.toJson(coursePOJO)); 
        editor.apply(); 
        editor.commit(); 
       } 
      } 
     } 
     } 
} 

これはHttpUtilクラスです

+1

コードを投稿して試したことを表示できますか? – wnieves19

+0

Feroz、この "質問"(質問さえありません)に私たちが答えるとどう思いますか?私たちは何を言いますか? 「活動を開始し、結果が到着するまでスプラッシュを表示してからユーザーをナビゲートする」 – azizbekian

+0

すごく残念ですが、コードは巨大に見えます。コードが更新されました –

答えて

0

あなたのスレッドの使用に基づいて、AsyncTaskを使用したほうがよいと言えるでしょう。

すべてのAsyncTaskにコールバックが必要であり、アクティビティが実装されている必要があります。タスクが完了した後で、アクティビティは操作を制御して決定を下すことができます。タスクの場合

public class SplashScreenTask extends AsyncTask<Void, Void, Void> { 

private Context context; 

private SplashScreenTaskCallback listener = null; 

public SplashScreenTask (Context context) { 
    this.context = context; 
} 

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

    // Do your tasks 


    return null; 
} 

@Override 
public void onPreExecute() { 
} 

@Override 
public void onPostExecute (Void v) { 
    if (listener != null) { 
     listener.OnSplashScreenTaskCompleted(); 
    } 
} 

public void setListener (SplashScreenTaskCallback listener) { 
    this.listener = listener; 
} 


public interface SplashScreenTaskCallback { 
    void OnSplashScreenTaskCompleted(); 
} 
} 

そして、あなたの活動:

public class SplashScreenActivity extends Activity implements SplashScreenTask.SplashScreenTaskCallback { 

protected Runnable postDelayedAction; 
private final Handler handler = new Handler(); 

@Override 
public void onCreate (Bundle savedInstanceState) { 

    Log.d(TAG, "onCreate"); 

    super.onCreate(savedInstanceState); 

    handler.postDelayed(startBackgroundTasks, splashScreenDelay); 

} 

private Runnable startBackgroundTasks = new Runnable() { 

    @Override 
    public void run() { 

     // Do initial background tasks like sounds load 
     SplashScreenTask task = new SplashScreenTask (SplashScreenActivity.this); 
     task.setListener (SplashScreenActivity.this); 
     task.execute(); 

    } 
}; 

@Override 
public void OnSplashScreenTaskCompleted() { 
    // Here you take decisions 
} 
} 
+0

返信してくれてありがとう、Asyncはスレッドより優れています。この場合、バックグラウンドスレッドを呼び出す必要があります。 –

+0

OnSplashScreenTaskCompletedの目的を解決しました。私はすべてのバックグラウンドタスクを実行しました –

+0

ようこそ! !! –

0

私はあなたのバックグラウンドタスクのすべてが完了したときを決定するのRxジップ演算子を使用します。複数の並列ジョブの完了を判断することは、Androidフレームワークの大きな頭痛です。

初期遅延のないスプラッシュ画面を表示し、テーマを使用して背景描画可能画を設定することがベストプラクティスです。それを行い、あなたのアクティビティ(あなたのスプラッシュスクリーンではなく)から実際にこのロジックをすべて消すことができるようにするには、あなたのアクティビティであなたのスプラッシュスクリーンのビジュアルを複製し、あなたのジョブが完了しました。

関連する問題