异步任务进度对话框未显示

时间:2015-10-03 22:03:21

标签: android android-asynctask progressdialog

我在显示进度对话框微调器时遇到问题。我查看了几个线程,建议的解决方案似乎不起作用。

AsyncTask中的所有代码都会被成功调用,但是我看不到正在显示的进度微调器。这个AsycTask是在一个单独的类中定义的,它是从我的片段中调用的,我将getActivity()作为上下文传递。

我的想法是,问题与如何将上下文赋予进度对话框有关。

public class ExampleClass
{
    private class loginAsyncTest  extends AsyncTask<HttpPackage, Void, String>
    {
        ProgressDialog dialog;
        Context spinnerContext;

        public void setSpinnerContext(Context context)
        {
            spinnerContext = context;
        }

        @Override
        protected void onPreExecute()
        {
            dialog = new ProgressDialog(spinnerContext);
            dialog.setMessage("Loading...");
            dialog.setIndeterminate(false);
            dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            dialog.setCancelable(true);
            dialog.show();
            Log.d("http", "dialog spinner started");
        }

        protected String doInBackground(HttpPackage... httpParameters)
        {
            HttpClient client = new DefaultHttpClient();
            String url = httpParameters[0].getUrl();
            // Get HTTP parameters that are passed in
            ArrayList<NameValuePair> parameterList = httpParameters[0].getParameters();
            HttpPost post = new HttpPost(url);
            String responseJson = "";

            try
            {
                post.setEntity(new UrlEncodedFormEntity(parameterList));
                HttpResponse response = client.execute(post);

                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                String line = "";
                while ((line = rd.readLine()) != null)
                {
                    responseJson = responseJson + line;
                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

            return responseJson;
        }

        protected void onPostExecute(String result)
        {
            if(dialog.isShowing())
            {
                dialog.dismiss();
            }
        }
    }
}

以下是对来自提供上下文的片段的ExampleClass的调用。

Public class SampelFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.dialog_login, container, false);    

        ExampleClass.loginRequest(params, getActivity()));

        return rootView;
    }
}

然后ExampleClass将上下文传递给我们的AsyncTask

public String loginRequest(HttpPackage postParameters, Context context)    
{
    loginAsyncTest loginAsync = new loginAsyncTest(context);
    loginAsync.execute(postParameters);

    return someString;
}

2 个答案:

答案 0 :(得分:0)

尝试使用ExampleClass.this作为给定的上下文,并确保调用方法setSpinnerContext()。

另外,我认为最好是方法setSpinnerContext()loginAsyncTask添加一个接收Context的构造函数。所以我会用这个替换方法setSpinnerContext(Context context)

public loginAsyncTask(Context context){
    this.context = context;
}

你应该将它实例化为 new loginAsyncTask(ExampleClass.this).execute();

答案 1 :(得分:0)

我没有看到你曾经调用过publishProgress()或覆盖了onProgressUpdate()。在我的应用程序中,我在doInBackground()方法中调用了publishProgress(),从而更新了我的进度条。 Android文档中的example非常简单但非常有用:

您还可以考虑在AsyncTask之外创建进度条,并将其作为构造函数中的参数或通过setter方法传递给AsynchTask。这样你就不必怀疑是否正在使用正确的上下文。