Android заставка и связь с сервером - PullRequest
2 голосов
/ 19 января 2012

Я занимаюсь разработкой приложения для Android, где мне нужно отобразить заставку, и в то же время будет происходить связь с сервером.Проблема здесь в том, что когда я запускаю приложение, сначала приложение связывается с сервером, а затем отображает заставку.Я хочу одновременно подключиться к серверу и на экране-заставке.

Ниже указан мой код:

 protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.splash_screen);

    try {

        Thread thread = new Thread(this);

        thread.start();

        thread.join();

        //Attractions
        CommonMethods.getSystemOutput("Response Json Array String Attractions:::"+jArrayMobileAttractions);

        attractionsDate = JsonParsing.getLatestDate(jArrayMobileAttractions);

        attractionsDate = getDate(attractionsDate);

        CommonMethods.getSystemOutput("Attractions Date:::::"+attractionsDate);

        //Categories
        CommonMethods.getSystemOutput("Response Json Array String Categories:::"+jArrayCategories);

        categoryDate = JsonParsing.getLatestDate(jArrayCategories);

        categoryDate = getDate(categoryDate);

        CommonMethods.getSystemOutput("Category date:::"+categoryDate);

        //Contacts
        CommonMethods.getSystemOutput("Response Json Array String Contacts:::"+jArrayContacts);

        contactsDate = JsonParsing.getLatestDate(jArrayContacts);

        contactsDate = getDate(contactsDate);

        CommonMethods.getSystemOutput("Contacts Date:::"+contactsDate);

    } catch (Exception e) {

        CommonMethods.getSystemOutput("Exception in Splash screen thread:::"+e);
    }

}

public void run() {

//      if (attractionsDate == null) {

        jArrayMobileAttractions = RequestHandler.getJSONfromURL(Constants.MOBILE_ATTRACTIONS_URL);

        jArrayCategories = RequestHandler.getJSONfromURL(Constants.CATEGORY_URL);

        jArrayContacts = RequestHandler.getJSONfromURL(Constants.CONTACTS_URL);


//      } else {

//          jArrayMobileAttractions = RequestHandler.getJSONfromURL(Constants.MOBILE_ATTRACTIONS_URL+"?lastupdateddate="+attractionsDate);

//      }

}

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Вы можете использовать AsynchTask Manager, в котором у него есть метод

 private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        // Do Server Interaction Here
        return response;
    }


@Override
    protected void onPreExecute(String result) {
        //Show your Splash Screen  
    }

    @Override
    protected void onPostExecute(String result) {
        //Gone the Splash Screen view
    }
}
0 голосов
/ 19 января 2012

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

Итак, у вас есть три класса AsyncTask, по одному для каждой задачи, и в onPostExecute () я вызываю следующий AsyncTask.Я не могу сказать, является ли это лучшим способом, но он работает для меня.

Я удалил ненужный код, но для ясности я оставил вызов диалоговому окну, где я спрашиваю пользователя, хочет ли он продолжить загрузку какэто может занять некоторое время.Кроме того, я проверяю, является ли FIRST_RUN истинным, просто для того, чтобы знать, должен ли я загружать пакет, поскольку для моего приложения мне нужно делать это только в первый раз, поэтому, если это правда, я выполняю действия spashscreen, и если это ложно, я перехожу к MAINAPPдеятельность.

Надеюсь, это поможет.

public class SplashScreen extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splashscreen);

    SharedPreferences settings = getSharedPreferences(PREFS_NAME,0);
    boolean firstRun = settings.getBoolean("FIRST_RUN", true);
    if (firstRun) {
        showDialog(INITIAL_DLG);
    } else {
        startActivity(new Intent(appContext, MAINAPP.class));
    }
}

/***
 * First entry after YES on Dialog!
 */
protected void initialize() {
    messageTV.setVisibility(TextView.VISIBLE);
    progressBar.setVisibility(ProgressBar.VISIBLE);
    downloadThread = new DownloadFiles();
    downloadThread.execute();
}

protected void rollback() {

}

@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog.Builder builder;
    switch (id) {
    case INITIAL_DLG:
        builder = new AlertDialog.Builder(this);
        builder.setMessage(R.string.app_setup)
        .setCancelable(false)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                initialize();
            }
        })
        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        alertDlg = builder.create();
        return alertDlg;
    default:
        return null;    
    }
}

protected class DownloadFiles extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {
        try {
            //file download
        } catch (Exception e) {
            result = false;
        }
        return true;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        unzipThread = new DecompressZipFile();
        unzipThread.execute();
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        messageTV.setText("Step 1/4:Downloading data...");
        progressBar.setProgress(0);
        progressBar.setMax(100);
        super.onPreExecute();
    }
}

protected class DecompressZipFile extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {
        try {
            //unzip files
            return true;    
        } catch(Exception e) {
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if (values[0]<0) progressBar.setMax(values[0]*-1);
        else progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        moveDBThread = new MoveDBFile();
        moveDBThread.execute();
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        messageTV.setText("Step 2/4:Decompressing data...");
        progressBar.setProgress(0);
        progressBar.setMax(100);
        super.onPreExecute();
    }
}

protected class MoveDBFile extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {
        try {
            //moving files
            return true;
        } catch (Exception e) {
            globalE = e;
            finish();
            return false;
        }
    }

    @Override
    protected void onPreExecute() {
        messageTV.setText("Step 3/4:Shufflin'...");
        progressBar.setProgress(0);
        progressBar.setMax(100);
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        if (result) {
            getSharedPreferences(PREFS_NAME,0).edit().putBoolean("FIRST_RUN", false).commit();
            startActivity(new Intent(appContext, MAINAPP.class));
        } else {
            rollback();
        }
    }
}

}

0 голосов
/ 19 января 2012

Для этого будет лучше начать с «SplashActivity» - в onCreate() запустить новый Thread для связи с сервером, а когда все коммуникации завершены - позвонить startActivityForResult(mainActivityIntent). Для правильного поведения кнопка возврата завершает всплеск активности на завершении основной активности. Примерный код:

public class SplashActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setup view for activity
        new Thread(new Runnable() {
            public void run() {
                // do here some long operation

                startActivityForResult(new Intent(SplashActivity.this, MainActivity.class), 0);
            }
        }).start();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        finish();
    }
}
...