gpt4 book ai didi

Android 变量在 AsyncTask 中交换值

转载 作者:行者123 更新时间:2023-11-30 03:48:10 25 4
gpt4 key购买 nike

我有一个显示服务器状态(在线或离线)的程序。我放入一个微调器来向用户展示它正在加载,在 AsyncTask 中我关闭在线/离线图像并在加载时打开微调器,完成后执行相反的操作。该代码完成了它的工作,但我觉得它是由一些小故障完成的,并且可能会在以后破坏它,所以我想现在就修复它。基本上发生的是在线/离线图像的变量和微调器交换值的变量,我不确定为什么。

这是我的代码:

public View background;
public View status;
public View loading;

class CheckStatusTask extends AsyncTask<Void, Void, Boolean> {

//show loading
protected void onPreExecute(){
status.setVisibility(View.VISIBLE);<-- this shows the spinner but should show online/offline
//loading.setVisibility(View.INVISIBLE);<-- this shows the online/offline but should show the spinner
}

//check if server is online
protected Boolean doInBackground(Void... params) {
return CheckStatus.check();
}

//set status bar to offline if flag is false
protected void onPostExecute(Boolean flag) {
status.setVisibility(View.INVISIBLE);<-- this shows the spinner but should show online/offline
//loading.setVisibility(View.VISIBLE);<-- this shows the online/offline but should show the spinner
if(!flag){
background.setBackgroundResource(R.layout.offline);
status.setBackgroundResource(R.drawable.offline);<-- correct
}
}

}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
background = findViewById(R.id.status);
status = findViewById(R.id.image);
loading = findViewById(R.id.loading);
new CheckStatusTask().execute();
}

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="#ffffff">

<!-- Status Starts-->
<LinearLayout android:id="@+id/status"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@layout/online"
android:paddingTop="5dip"
android:paddingBottom="5dip">
<!-- Online/Offline Start-->


<ImageView android:id="@+id/image"
android:src="@drawable/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"/>
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- Online/Offline Ends -->

</LinearLayout>
<!-- Status Ends -->


<!-- Main Form -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_below="@id/status">

<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#372c24"
android:text="Home"/>

</LinearLayout>
<!-- Main Form Ends -->
</RelativeLayout>
</ScrollView>

如您所见,状态变量定义为显示在线/离线图像,加载变量定义为显示微调器,但它们的作用恰恰相反。这只发生在其他任何地方的这个特定功能上。

最佳答案

android:background="@layout/online"

通过这一行,您将线性布局的背景设置为 res/layout/ 文件夹中的可绘制形状。

可绘制资源,例如形状可绘制资源,应放置在 res/drawable/ 文件夹中。通过将其存储在布局文件夹中,它会混淆资源的 R.id 值。我不确切地知道为什么问题会以这种方式表现出来。但是将那些 online.xml 和 offline.xml 移动到 res/drawable/ 并删除 res/layout/ 中的那些应该可以解决它。

移动文件后,将上面的行更改为:

android:background="@drawable/online"

参见 Drawable Resources有关 xml 可绘制资源的更多信息。

关于Android 变量在 AsyncTask 中交换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com