2013-05-29 5 views
0

Я довольно новичок в программировании для Android и хотел бы прояснить сценарий. Хорошо, у меня есть два действия под названием A & B. Когда запускается действие A, он запрашивает загрузку некоторых данных в фоновом режиме, и в любом случае через 3 секунды запускается операция B. Активность A действует как заставка. Поэтому, когда запускается активность B, я хочу провести и ждать, пока данные будут полностью загружены, чтобы я мог инициализировать загруженные данные в активности B. В настоящий момент активность B запускается еще до загрузки данных. Если это так, после загрузки B и загрузки данных, как бы я динамически загружал данные в активность B? Кроме того, есть ли способ удерживать onCreate в активности B до тех пор, пока данные не будут загружены?Как сохранить активность до тех пор, пока данные не будут загружены/доступны

Заранее спасибо.

+1

Начало деятельности A (заставка), начните загрузку, когда загрузка будет завершена, завершите операцию A и начните действие B – mihail

+1

Это будет плохой дизайн. Вы не должны выполнять длительный процесс ожидания в потоке пользовательского интерфейса, что приведет к ANR. Одним из решений может быть создание asynctask для загрузки в Activity A, и после завершения загрузки вызовите Activity B, передавая загруженные данные. – Anirudh

+0

Чтобы ответить на другой вопрос, вы всегда можете обновить существующий вид с помощью новой информации, вызвав метод invalidate() для представления. В случае ListView вызовите метод notifyDataSetChanged() для ArrayAdapter. – Anirudh

ответ

1

Я думаю, вы используете AsyncTask для загрузки фоновых данных. если да, тогда вы просто запускаете операцию B из метода onPostExecute() asyncTask.

вы можете создать seprate тему или InnerClass

public class ThreadCutFiles extends AsyncTask<Object, Object, Boolean>{ 

    private ProgressDialog progressDialog; 
    private Context context; 
    private Handler handler; 

    public ThreadCutFiles(Context context, Handler handler) { 
     this.context = context; 
     this.handler = handler; 
    } 

    @Override 
    protected void onPreExecute() { 
     progressDialog = new ProgressDialog(context); 
     progressDialog.setTitle("File Manager"); 
     progressDialog.setMessage("Copying Files...");  
     progressDialog.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Object... params) { 
     //ur downloading code 
     return true; 

    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     progressDialog.dismiss(); 

     } 
    } 
} 
+0

Как им потребовалось бы загрузить нагрузку B и показать индикатор выполнения или что-либо еще, поскольку активность A действует как заставка. поэтому мне нужно загрузить активность B. после этого onCreate я могу держать, пока данные не загружаются? –

+1

или вы можете просто запустить асинтетовую нить в действии B .. – NaserShaikh

1

Предполагая, что вы используете AsyncTask, вы можете создать функцию обратного вызова в деятельности B, которую вы называете в onPostExecute из AsyncTask прохождения загруженных данных в деятельности В. Таким образом вам нужно всего лишь поместить диалог загрузки в действие B onCreate и позаботиться о загрузке данных в обратном вызове.

A:

public class ActivityA extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 
    //start download task 
    ActivityB b = new ActivityB(); 
    startActivity(new Intent(getApplicationContext(), b.getClass())); 
    new Task(b.new DownloadCallback()).execute(); 
    } 

} 

B:

public class ActivityB extends Activity { 

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

@Override 
public View onCreateView(String name, Context context, AttributeSet attrs) { 
    //show a progress dialog 
    return super.onCreateView(name, context, attrs); 
} 

private void loadData(/*Your data*/){ 
    //Load your data 
    System.out.println("data loaded"); 
} 

public class DownloadCallback { 

    public void onFinish(/*Your data*/) { 
     loadData(/*Your data*/); 
    } 

    } 

} 

Задача:

public class Task extends AsyncTask<Void, Void, Object>{//Change the Object to whatever your data is 

private DownloadCallback callback; 

public Task(DownloadCallback callback) { 
    this.callback = callback; 
} 

@Override 
protected Object doInBackground(Void... params) { 
    //Download data here 
    //Change the Object return value to whatever your data is 
    return true; 
} 

@Override 
protected void onPostExecute(Object result) { 
    //Change the Object to whatever your data is and pass to the finish method 
    callback.onFinish(/*Your data*/); 
    } 
} 
+0

Как я узнаю, когда вызывать onPostExecute из AsyncTask из активности B? –

+0

Только что отредактировал, как я пытался объяснить. – Mikel

1

можно реализовать либо Loader (предпочитаемое) или Async задачи для загрузки данных в деятельности А. Когда загрузка данных завершена, onLoadFinished или onPostExecute открывают активность B и передают загруженные данные с i ntent. Я бы предложил показать значок загрузки в Activity A, чтобы пользователи знали, что ваше приложение выполняет некоторую работу в фоновом режиме.

+0

Как им потребовалось бы загрузить активность B и показать индикатор выполнения или что-то еще, поскольку активность A действует как заставка. поэтому мне нужно загрузить активность B. после этого onCreate я могу держать, пока данные не загружаются? –

+0

Да Вы можете использовать активность A только в качестве заставки и использовать загрузчик, асинхронную задачу в действии B для загрузки данных. Что вы подразумеваете под удержанием, пока данные не будут загружены?Если вы не хотите, чтобы пользователь нажимал кнопку «Назад» и выходил из приложения при запуске загрузки, вы можете показать диалог выполнения и сделать его не отмененным. Это не остановит пользователя нажать кнопку «Домой» и вернуться на главный экран, хотя – Ethan

Смежные вопросы