#java #android
#java #Android
Вопрос:
clipProgress сбрасывает индикатор выполнения на ноль:
public class Whatever extends Activity implements ListenerA, ListenerB {
private Handler mHandler = new Handler();
ProgressBar myProgressBar;
int myProgress = 0;
public void clipProgress() {
myProgressBar = (ProgressBar)findViewById(R.id.progressbar);
myProgressBar.setProgress(myProgress);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
clipProgress();
public void onClick(View view) {
Duration.duration = 0;
startRecording();
new Thread(new Runnable(){
@Override
public void run() {
while(myProgress<100){
try{
myHandle.sendMessage(myHandle.obtainMessage());
Thread.sleep(50);
}catch(Throwable t){
}
}
}
}).start();
}
Handler myHandle = new Handler(){
@Override
public void handleMessage(Message msg) {
myProgress ;
myProgressBar.setProgress(myProgress);
}
};
});
}
Ниже у меня есть два разных метода, в которых, я полагаю, я мог бы попытаться сбросить индикатор выполнения до нуля. Но они оба принадлежат к совершенно другому классу:
@Override protected void onPostExecute(Void result) {
Whatever.clipProgress(); //...which throws all kinds of red lines if I use this statement.
}
и
public void stopThis(){
thing.stop();
try {
Whatever.clipProgress(); //...which throws all kinds of red lines if I use this statement.
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Eclipse хочет применить «static» к различным инициализациям в любом классе. Но эти исправления просто оставляют findViewById(R.id.progressbar) красным.
Я просто хочу сбросить индикатор выполнения (который был запущен из класса 1) из класса 2. Это слишком много, о чем я прошу.
ОБНОВЛЕНИЕ: независимо от того, что является отправной точкой, активность Android. Его обработчик, который я должен был включить в приведенный выше снип, прямо под onCreate включен в приведенный ниже снип. Таким образом, более полно и вызывается с помощью кнопки, таким образом:
public void onClick(View view) {
new Thread(new Runnable(){
@Override
public void run() {
while(myProgress<100){
try{
myHandle.sendMessage(myHandle.obtainMessage());
Thread.sleep(87);
}catch(Throwable t){
}
}
}
}).start();
}
Handler myHandle = new Handler(){
@Override
public void handleMessage(Message msg) {
myProgress ;
myProgressBar.setProgress(myProgress);
}
};
Как только эта кнопка нажата, создается прослушиватель:
myTask = new Task();
myTask.addTaskListener(this);
myTask.execute(this);
Он находится внутри класса Task:
public class Task extends AsyncTask<Whatever, ArrayList<Float>, Void>{
...
public void addTaskListener(TaskListener rl){
this.rl = rl;
}
...
что эти две функции находятся, одну из которых я надеюсь использовать, чтобы остановить индикатор выполнения.
Задача предназначена в другом месте для завершения работы ровно через постоянное количество секунд, и поэтому я могу жестко ввести 50 в это значение индикатора выполнения в sleep(). Я просто хочу иметь возможность закрыть панель обратно до нуля раньше, если я остановлю задачу раньше.
Комментарии:
1. Вам нужен любой объект в другом классе, чтобы получить доступ к нестатическим методам в любом классе. Это элементарно.
2. Ну, я новичок в Java. Спасибо.
Ответ №1:
Eclipse предупреждает вас, потому что вы обращаетесь к clipProgress
методу статическим способом (путем вызова Whatever.clipProgress()
).
Кроме того, вы должны назначить свой индикатор выполнения только один раз, поэтому переместите
myProgressBar = (ProgressBar)findViewById(R.id.progressbar);
в ваш onCreate
метод.
Вероятно, вам следует передать ProgressBar в другой класс, который должен его обновить, а затем сделать что-то вроде
myProgressBar.post(new Runnable() {
public void run() {
myProgressBar.setProgress(myProgress);
}
});
этот post
метод обновляет ProgressBar в потоке пользовательского интерфейса, что является единственным безопасным способом сделать это. Убедитесь, что вы делаете все это только в том случае, если действие с ProgressBar в данный момент активно.
Вы также должны задаться вопросом, нужно ли вам вообще обновлять индикатор выполнения в этом другом классе. Я вижу только, что вы обновляете myProgress
переменную внутри своего обработчика, где вы сразу же устанавливаете прогресс на панели. Не могли бы вы подробнее рассказать о взаимосвязи между этим другим классом и активностью с вашим индикатором выполнения?
Комментарии:
1. Когда вы говорите, что я должен передать ProgressBar в другой класс, которому необходимо его обновить, я должен спросить: «Как?»
2. Конструктор вашего другого класса может принимать индикатор выполнения, например,
OtherClass(..., ProgressBar pbar) { ... }
и сохранять его как поле, а затем обращаться к нему позже. Но убедитесь, что исходное действие с индикатором выполнения все еще находится на переднем плане, когда вы все это делаете.3. Спасибо. Я постараюсь сделать это, и если у меня возникнут какие-либо вопросы, я опубликую их здесь снова.
4. Крейги, спасибо за твой совет. Я пытаюсь изучить лучшие практики, и то, что вы передали, действительно ценно таким образом. Я добавил некоторую дополнительную информацию в ОП выше.
5. Итак, я предполагаю, что я спрашиваю, как мне передать то, что мне нужно, в этот асинхронный объект задачи?
Ответ №2:
Это больше связано с программированием на Java и методами экземпляра / статики, чем с Android:
При вызове Whatever.clipProgress()
вы пытаетесь выполнить вызов статического метода, вызываемого clipProgress
в Whatever
классе, поэтому Eclipse хочет добавить static
модификатор.
Однако findViewById()
включен метод экземпляра (читайте ссылку выше) Activity
, который, предположительно, является некоторым предком вашего Whatever
класса. Статические методы не могут статически вызывать методы экземпляра, поэтому, даже если вы позволите Eclipse сделать clipProgress
статическим, вам нужно вызвать clipProgress
экземпляр вашей активности.
У вашего другого класса должна быть ссылка на экземпляр класса, который вы хотите вызвать clipProgress()
. Вы должны либо передать эту ссылку на другой класс, либо, как отметил другой плакат, передать ссылку на самого ProgressBar
себя.
Затем вы можете вызвать, например mWhatever.clipProgress()
, или progressBar.setProgress(0)
.
Комментарии:
1. Спасибо вам за это. Я сожалею, что I stackoverflow позволяет мне проверить только один ответ (в данном случае первый аналогичный ответ).
2. «Ваш другой класс должен иметь ссылку на экземпляр класса, для которого вы хотите вызвать функцию clipProgress(). Вы должны либо передать эту ссылку на другой класс, либо, как отметил другой плакат, передать ссылку на сам ProgressBar «. Я не понимаю, как передать ссылку на саму панель выполнения. (Или «та» другая ссылка, что бы это ни было.)