gpt4 book ai didi

java - 如何在java中的不同线程中显示和隐藏一个 View ?

转载 作者:行者123 更新时间:2023-12-01 12:54:34 26 4
gpt4 key购买 nike

我为 Android 编写了我的第一个 java 程序,它使用 OpenGL 绘制一些 3D 函数 (f(x,y)),该程序即将完成,但我在显示和隐藏自定义进度条时遇到问题,该程序开发为 LinearLayout(我用一些文本和进度条创建了)。我需要在计算 3dfunction 值之前和期间使 ProgressBarLL 可见。为此,我在 Graph3dActivity 中实现了一个处理程序:

public class Graph3dAct extends Activity {
(...)
static ProgressBar progressBarPB;
static LinearLayout progressBarLL;
public static Handler progressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.e("HANDLER:",Integer.toString(msg.arg1));
//toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 500);
switch (msg.arg1)
{
case 1: progressBarLL.setVisibility(LinearLayout.VISIBLE);
break;
case 2: progressBarLL.setVisibility(LinearLayout.INVISIBLE);
break;
case 3: progressBarPB.setProgress(msg.arg2);
//to be implemented
break;
default: Log.e("Graph3dAct","Handler misused;");
}
progressBarLL.invalidate();
progressBarPB.invalidate();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(...)
progressBarPB = (ProgressBar) findViewById(R.id.surface3dPB);
progressBarLL = (LinearLayout) findViewById(R.id.progressLL);
(...)
final Button moreStepsB = (Button) findViewById(R.id.buttonMoreS);
moreStepsB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int max=stepsVals.length-1;
if (stepsIndex<max)
{
stepsIndex++;
steps=stepsVals[stepsIndex];
FuncSurf fs = new FuncSurf(steps);
renderer.funcSurf = fs;

然后我让 FuncSurf 及其构造函数对表面进行持久计算。我需要在计算之前显示我的进度条:

public class FuncSurf {
public FuncSurf(int steps_) {
Log.e("FuncSurf","CONSTRUCTOR");
Message msg = new Message();
msg.arg1=1; //instruct handler to show progress layout: progressBarLL
Graph3dAct.progressHandler.sendMessage(msg);

(...) HERE GOES LONG-LASTING CALCULATION

msg = new Message();
msg.arg1=2; //instruct handler to hide progress layout: progressBarLL
Graph3dAct.progressHandler.sendMessage(msg);
}

问题是,当我从上面 Activity 中实现的 onClick 事件调用函数 FuncSurf 构造函数时,它会导致在很短的时间内显示 ProgressBarLL ,不幸的是在计算完成之后而不是之前。换句话说,处理程序在 FuncSurf 构造函数完成后处理消息不是同时进行的。这可能是因为它是同一个线程?但是当从渲染器调用 FuncSurf() 构造函数时,一切正常:

class MyOpenGLRenderer implements Renderer {
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
funcSurf = new FuncSurf(steps); //progressBarLL shown OK

我的问题是如何可能巧妙地更正代码,以便在 FuncSurf() 构造函数中的计算之前显示 ProgressBarLL,无论我在哪里调用此构造函数?我无法直接在 funcSurf 中使用progressBarLL.setVisibility,因为上面的 onSurfaceChanged(...) 调用时这不是 GUI 线程。很抱歉我无法更清楚地解释这个问题。我期待您的帮助。

最佳答案

使用AsyncTask ,它正是针对这种情况而设计的(并且采用线程交互的情况,而不需要消息或类似的东西)。

  • onPreExecute() 在 UI 线程中运行,使进度条可见。
  • doInBackground() 在后台线程中运行长计算。定期调用 publishProgress() 来通知进度。
  • onProgressUpdate() 在 UI 线程中运行,并推进进度条。
  • onPostExecute() 在 UI 线程中运行,并使进度条不可见。

请参阅 Keeping your App Responsive 的文档,它包含一个类似的示例(其中长时间运行的任务是网络操作)。

关于java - 如何在java中的不同线程中显示和隐藏一个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998679/

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