我在显示进度对话框微调器时遇到问题。我查看了几个线程,建议的解决方案似乎不起作用。
此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;
}
答案 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。这样你就不必怀疑是否正在使用正确的上下文。