2016-09-02 4 views
1

나는 인터넷에서 나가는 앱을 가지고있다. 그 위에 몇 가지 수학이 있고 그 후에 그것은 또 다른 활동을 시작합니다. 여기 스플래시 화면이 표시되는 동안 코드 실행

내가 백그라운드에서 시간 다운로드가 포함 된 웹 페이지의 콘텐츠를하고 난 그것에 패턴 매처를 실행 나의되는 SplashScreen 활동

package com.firefluxentertainment.retroclicker; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.os.CountDownTimer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.concurrent.ExecutionException; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class SplashActivity extends AppCompatActivity { 

    long endTime; 
    long timeDelta; 
    Long endTimeMaths; 
    long timeStamp; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 

     load(); 


     getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 

     DownloadTask task = new DownloadTask(); 
     String result = null; 

     try { 

      result = task.execute("http://www.currenttimestamp.com/").get(); 

      Pattern p = Pattern.compile("current_time = (.*?);"); 
      Matcher m = p.matcher(result); 
      m.find(); 
      String unixTime = (m.group(1)); 
      timeStamp = Integer.parseInt(unixTime); 
      endTimeMaths = endTime/1000; 

     } catch (InterruptedException e) { 

      e.printStackTrace(); 

     } catch (ExecutionException e) { 

      e.printStackTrace(); 
      Toast.makeText(SplashActivity.this, "you aint got no internet man", Toast.LENGTH_SHORT).show(); 

     } 

     timeDelta = timeStamp-endTimeMaths; 

     Log.i("TimeDelta", timeDelta+""); 

    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
     if (hasFocus) { 
      getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
          | View.SYSTEM_UI_FLAG_FULLSCREEN 
          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     new CountDownTimer(2000, 1000) { 

      public void onTick(long millisUntilFinished) { 
      } 

      public void onFinish() { 
       Intent i = new Intent(getApplicationContext(), MainActivity.class); 
       startActivity(i); 
      } 

     }.start(); 
    } 

    public class DownloadTask extends AsyncTask<String, Void, String> { 


     @Override 
     protected String doInBackground(String... urls) { 

      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 

      try { 

       url = new URL(urls[0]); 

       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream in = urlConnection.getInputStream(); 

       InputStreamReader reader = new InputStreamReader(in); 

       int data = reader.read(); 

       while (data != -1) { 

        char current = (char) data; 

        result += current; 

        data = reader.read(); 
       } 

       return result; 

      } catch (Exception e) { 

       e.printStackTrace(); 

      } 

      return null; 
     } 
    } 

    void save(){ 
     SharedPreferences pref = this.getSharedPreferences("TEST_PREFS", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = pref.edit(); 

     editor.putLong("endTime", endTime); 
     editor.commit(); 
    } 

    void load() { 
     SharedPreferences pref = this.getSharedPreferences("TEST_PREFS", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = pref.edit(); 

     endTime = pref.getLong("endTime", System.currentTimeMillis()/1000); 
     editor.apply(); 
    } 

} 

의 코드입니다. 문제는 대부분 웹 페이지를 다운로드하는 대신 matcher를 실행하는 데 낭비되고 있다는 것입니다. matcher가 주 스레드에서 실행 중이기 때문에 UI 스레딩이 지연되어서 splashscreen 레이아웃에서 설정 한 로고가 정규 표현자가 완성 될 때까지 표시되지 않습니다. matcher가 백그라운드에서 실행되어 UI가 지연되지 않도록하려면 어떻게해야합니까?

당신의 도움이

+0

'task.execute'에서'.get()'을 제거하고'onPostExecute' 메서드 내에서'Pattern matching'을 모두 수행하십시오. –

+0

@ ρяσѕρєяK .get()은 그것을 일치시킬 수 있도록 문자열로 변환합니다. .get을 제거하면 정규식에 의해 인덱싱 할 수없는 임의의 비동기 변수 유형이 전송됩니다. –

답변

0

당신이 AsyncTask는만큼 Activity이 살아로 실행하는 것입니다이 문제 주셔서 감사합니다. 에서 그것을 분리하려면 Activity 당신은 몇 가지 옵션이 있습니다 :

  1. 아마이 문제를 처리하는 IntentServiceIntent를 전송 할 수있는 가장 좋은 것은. 결과를 지속 시키거나 (예 : SharedPrefs) 바인더/콜백을 작성하거나 다른 방법을 사용하여 데이터를 가져와야합니다.

  2. Application 클래스에 AsyncTask을 넣으십시오. 그것은이 클래스의 목적이 아니기 때문에 좋은 아이디어는 아니지만 작동 할 것입니다. SplashScreen로에서

  3. 만 다음, 데이터를 얻을 다음 Activity에 의도에서 그것을 전달하는 전화를 걸 - 그 Activity의 패턴 매칭을 수행 할 AsyncTask를 실행합니다. 이렇게하면 처리가 중단되지만 두 화면에서 이러한 호출을 기다리는 사용자가 발생할 수 있습니다. 그래도 앱이 매우 오래 기다리는 것보다는 "무언가를하는 것"을 보는 것이 낫습니다.

이 문제를 해결할 수있는 다른 방법이 있지만 너무 복잡하지 않으면 서 가장 좋은 방법 일 수 있습니다.

관련 문제