5

当用户单击一个活动中的按钮时,我需要处理一些数据,因此屏幕看起来应用程序停止了 2-3 秒。这不是很多,但我想向用户提供一切正常的信息,IMO 最好的方法是进度条,只有在处理数据时才可见。

我找到了 ProgressBar 的代码,它看起来像这样:

    <ProgressBar
    android:id="@+id/loadingdata_progress"
    style="?android:attr/progressBarStyle"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignBottom="@+id/fin2_note"
    android:layout_centerHorizontal="true"
    android:indeterminate="true"
    android:visibility="invisible" />

并将其插入我的布局中间。

并尝试如果进度条工作,我把这段代码

loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); loadingimage.setVisibility(View.VISIBLE);

进入onCreate方法,一切看起来都很好。然后我重新创建了代码以仅在处理数据时才显示此进度条。

点击后用户调用该方法

   public void fin2_clickOnFinalization(View v)
   {    

            loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress);
    loadingimage.setVisibility(View.VISIBLE);

          // code where data is processing
            loadingimage.setVisibility(View.INVISIBLE);
       }

屏幕上什么也没有出现。我不知道哪里错了。如果我通过 id 找到进度条,对我来说很奇怪,我可以在 onCreate 方法中控制它,但在 onclick 方法中它是我无法控制的。

4

4 回答 4

8

您的 UI 线程无法显示进度条,因为由于您的数据处理,它很忙。尝试使用这种代码:

public void fin2_clickOnFinalization(View v) {

    new YourAsyncTask().execute();
}

private class YourAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... args) {
        // code where data is processing
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {         
        loadingimage.setVisibility(View.INVISIBLE);
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        loadingimage.setVisibility(View.VISIBLE);
    }
}

编辑:

AsyncTask 让您在单独的线程中运行代码并使应用程序更具响应性,只需将耗时的代码放入doInBackground.

于 2013-09-25T12:58:31.163 回答
4

您没有给 UI 刷新时间。您的“数据处理”代码在 UI 线程上运行,阻止任何可见的更改。当系统控制刷新显示时,您已经将其设置回不可见状态。

要解决此问题,请将您的处理代码移动到单独的线程或AsyncTask。然后,您可以将进度条设置为可见,启动任务,并让它在完成后变为不可见。

我会在大约 90% 的时间在 Android 上为此目的推荐 AsyncTask,因为它带有有用的回调。它的开发人员指南(在上面链接的 Javadoc 中)非常明确,并概述了您需要采取的所有步骤。

于 2013-09-25T12:39:06.930 回答
4

对于此类任务,AsyncTask 的权重太大。

更好的解决方案

Handler handler = new Handler(getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        loadingimage.setVisibility(View.VISIBLE);
    }
});

甚至更简单(与上述解决方案基本相同)

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        loadingimage.setVisibility(View.VISIBLE);
    }
});
于 2014-03-29T00:10:03.423 回答
1

您可以尝试不在布局中而是在您的活动中创建全局 ProgressDialog,例如:

public class MyActivity {

ProgressDialog progress = null;

protected void onCreate(...) {
    progressDialog = new ProgressDialog(this);
    progressDialog.setCancelable(false);
    progressDialog.setTitle("Progress");
}

public void fin2_clickOnFinalization(View v)
{    
    progress.show();
    // code where data is processing
    progress.dismiss();
}

}

希望我有帮助

于 2013-09-25T12:42:47.607 回答