WedX - журнал о программировании и компьютерных науках

Android, как дождаться вызова в заставке в Android

Мой сценарий заключается в том, что у меня есть 5 параллельных вызовов потоков, которые происходят в заставке, но мне нужно дождаться выполнения одного конкретного потока (который является DashBoardCallable), чтобы я мог загрузить данные панели мониторинга, показать экран-заставку, пока данные панели не будут загружены, и как только данные панели получить загруженное изменение активности, в то время как параллельно я загружаю еще некоторые данные, связанные с этим пользователем в фоновом режиме (что будет делать класс использования потока).

или вы можете так понять, что у меня есть ExecutorService из 5 потоков для параллельных вызовов, а Splashscreen основан на выполнении одного потока из 5. Как только выполнение этого потока выполнено, измените действие, оставив остальное выполнение другого потока в фоновом режиме.

ниже приведен код активности всплеска:

    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 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();
    }
}

это класс threadUtil:

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:

public class HttpUtil {
    private String url;
    private String type;
    private HashMap<String,String> param;
    private String postrequest;
    public HttpUtil(){}
    private int socketTimeOut=0, connectionTimeOut=0;

    public HttpUtil(String url, String type, HashMap<String, String> param,String postrequest) {
        this.url = url;
        this.type = type;
        this.param = param;
        this.postrequest = postrequest;
    }


    public String getStringResponse(){
        String jsonresponse="";
        try {
            System.out.println("url "+url);
            System.out.println("type "+type);

            HttpResponse httpResponse = getHttpResponse();
            if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {
                HttpEntity httpEntity = httpResponse.getEntity();
                jsonresponse = EntityUtils.toString(httpEntity);
                if(jsonresponse.equalsIgnoreCase("[]")){
                    jsonresponse="";
                }
                System.out.println("HttpUtil Response is .... " + jsonresponse);
            } else {
                return "null";
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return jsonresponse;
    }
    public void getVoidResponse(){

    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public HashMap<String, String> getParam() {
        return param;
    }

    public void setParam(HashMap<String, String> param) {
        this.param = param;
    }

    private HttpResponse getHttpResponse(){
        HttpResponse httpResponse = null;
        HttpClient httpclient = new DefaultHttpClient();
        try{
        switch(type){
            case "GET":
                if(socketTimeOut != 0 && connectionTimeOut != 0){
                    HttpParams httpParameters = new BasicHttpParams();
                    HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeOut);
                    HttpConnectionParams.setSoTimeout(httpParameters, socketTimeOut);
                    httpclient = new DefaultHttpClient(httpParameters);
                }
                httpResponse = httpclient.execute(new HttpGet(url));

                break;
            case "POST":
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                if(param != null) {
                    for (String key : param.keySet()) {
                        nameValuePairs.add(new BasicNameValuePair(key, param.get(key)));
                    }
                }
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                httpResponse = httpclient.execute(httpPost);
                break;
            case "PUT":
                HttpPut httpPut = new HttpPut(url);
                if(postrequest != null){
                    StringEntity se = new StringEntity(postrequest);
                    se.setContentType("application/json;charset=UTF-8");//text/plain;charset=UTF-8
                    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
                    httpPut.setEntity(se);
                    httpPut.setHeader("Accept", "application/json");
                    httpPut.setHeader("Content-type", "application/json");
                }
                httpResponse = httpclient.execute(httpPut);
                break;
            default:
                httpResponse = httpclient.execute(new HttpGet(url));
                break;
        } }catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }catch (JsonSyntaxException jse) {
            jse.printStackTrace();
            return null;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

        return httpResponse;
    }

    public String getPostrequest() {
        return postrequest;
    }

    public void setPostrequest(String postrequest) {
        this.postrequest = postrequest;
    }

    public int getSocketTimeOut() {
        return socketTimeOut;
    }

    public void setSocketTimeOut(int socketTimeOut) {
        this.socketTimeOut = socketTimeOut;
    }

    public int getConnectionTimeOut() {
        return connectionTimeOut;
    }

    public void setConnectionTimeOut(int connectionTimeOut) {
        this.connectionTimeOut = connectionTimeOut;
    }
}

  • Можете ли вы опубликовать свой код и показать нам, что вы пробовали? 20.04.2017
  • Фероз, как вы ожидаете, что мы ответим на этот вопрос (даже вопроса нет)? Что мы должны сказать? Запустить активность, показать всплеск, пока не появится результат, а затем перейти к пользователю? 20.04.2017
  • извините, ребята, но код кажется огромным. код находится под вопросом 20.04.2017
  • Мы видели код, который вы добавили. Но вы должны задать реальный вопрос 20.04.2017
  • у меня есть 5 параллельных вызовов потоков, которые происходят в фоновом режиме, но мне нужно дождаться выполнения одного конкретного потока (который является DashBoardCallable), чтобы я мог загрузить данные панели мониторинга и изменить активность, в то время как параллельно я загружаю еще некоторые данные, связанные с этим пользователем в фоновом режиме 20.04.2017

Ответы:


1

Основываясь на использовании ваших потоков, я могу сказать, что вам лучше использовать 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
}
}
20.04.2017
  • спасибо за ответ, сэр, Async будет лучше, чем поток, где я должен вызывать свои фоновые потоки в этом случае 20.04.2017
  • это решает мою цель в OnSplashScreenTaskCompleted, я выполнил все свои фоновые задачи 20.04.2017

  • 2

    Я бы использовал оператор Rx zip, чтобы определить, когда все ваши фоновые задачи завершены. Определение завершения нескольких параллельных заданий — огромная головная боль для платформы Android.

    Существует лучшая практика для отображения экрана-заставки без начальной задержки, когда вы устанавливаете фон, который можно рисовать, используя темы. Для того, чтобы сделать это и перейти к своей деятельности (не к экрану-заставке), где вы можете фактически отключить всю эту логику, просто продублируйте визуальные элементы экрана-заставки в своей деятельности и отключите отображение этих визуальных элементов после того, как ваши задания будут завершены. завершенный.

    20.04.2017
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]