Я работаю над Android-приложением, которое ведет себя странно. Одна из первых вещей, которую это приложение делает при запуске, - начать прослушивающий поток, который слушает приложение «сервер» на том же устройстве, чтобы получить данные. Как только эти данные будут получены потоком прослушивания, я использую его для обновления основного вида. Это, однако, работает только в том случае, если мое приложение запускается после серверного приложения.Почему просмотр моего Android-приложения обновляется только при определенных обстоятельствах?
Сначала несколько деталей. Мое приложение и серверное приложение находятся на одном устройстве. Они взаимодействуют друг с другом через UDP (серверное приложение является портом приложения Windows). Мое приложение использует фрагменты, но представление, которое я хочу обновить, не находится в фрагменте. Теперь немного кода.
content_main.xml
<RelativeLayout>
<LinearLayout>
<ImageView
android:id="@+id/my_image_id"
android:src="@drawable/my_image" />
</LinearLayout>
<LinearLayout>
<!-- fragment code here -->
</LinearLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
Listener myListener = new Listener(this);
Thread listenerThread = new Thread(myListener);
listenerThread.setName("My Listener Thread");
listenerThread.start();
}
}
Listener.java
public class Listener implements Runnable {
public Listener (Activity mainActivity) {this.mainActivity = mainActivity;}
private Activity mainActivity;
private ImageView myImageView;
private NewData newData;
@Override
public void run(){
while(true){
// Here is where my app gets the data from the server via UDP.
// This always works, I am always getting the correct data.
myImageView = (ImageView) mainActivity.findViewById(R.id.my_image_id);
mainActivity.runOnUiThread(new Runnable(){
@Override
public void run(){
if(newData == 1){
myImageView.setImageResource(R.drawable.new_image_01);
} else if(newData == 2){
myImageView.setImageResource(R.drawable.new_image_02);
} else {
myImageView.setImageResource(R.drawable.error_image);
}
}
});
}
}
}
Как я са id, если я запустил приложение после серверного приложения, тогда все это работает отлично. Изображения всегда меняются при изменении новых данных. Однако, если я запустил приложение перед серверным приложением или перезапустил серверное приложение, пока мое приложение все еще работает, изображения никогда не изменятся, хотя я все равно получаю правильные данные от серверного приложения.
Что я могу сделать, чтобы убедиться, что просмотр может обновляться в любое время?
EDIT: Я переехал туда, где получаю представление за пределами цикла while (в качестве теста), и теперь код вообще не работает.
что в то время как петля убивает котят. – Emmanuel
Если у вас есть лучшее решение, я бы хотел его услышать. (Я серьезно, а не саркастично.) – Brian
Значит, код связи? Возможно, приложение сервера запустило широковещательную рассылку, когда его приложение начнет прослушивать ваше приложение и запускает новое соединение в этот момент. –