请帮助,我不能在同步时解除ProgressDialog。方法sincronizaahora调用方法pre为showdialog和方法 actualizarDatosLocalesProductos调用方法pre来解除progressdailog,但它不起作用。
private void actualizarDatosLocalesProductos(JSONObject response, SyncResult syncResult)
{
JSONArray productos = null;
int j=3;
try
{
// Obtener array "productos"
productos = response.getJSONArray(Constantes.PRODUCTOS);
} catch (JSONException e) {
e.printStackTrace();
}
// Parsear con Gson
Producto[] res = gson.fromJson(productos != null ? productos.toString() : null, Producto[].class);
List<Producto> data = Arrays.asList(res);
// Lista para recolección de operaciones pendientes
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// Tabla hash para recibir las entradas entrantes
HashMap<String, Producto> expenseMap = new HashMap<String, Producto>();
for (Producto e : data) {
expenseMap.put(e.idProducto, e);
}
// Consultar registros remotos actuales
Uri uri = ContractParaDatos.CONTENT_URI_PRODUCTO;
String select = ContractParaDatos.ColumnasProducto.ID_REMOTA + " IS NOT NULL";
Cursor c = resolver.query(uri, PROJECTION_PRODUCTOS, select, null, null);
assert c != null;
Log.i(TAG, "Se encontraron " + c.getCount() + " registros locales.");
// Encontrar datos obsoletos
String id;
String nombre;
Double precio;
Double iva;
while (c.moveToNext())
{
syncResult.stats.numEntries++;
id = c.getString(COLUMNA_ID_REMOTA);
nombre = c.getString(COLUMNA_PRODUCTO);
precio = c.getDouble(COLUMNA_PRECIO);
iva = c.getDouble(COLUMNA_IVA);
Producto match = expenseMap.get(id);
if (match != null) {
// Esta entrada existe, por lo que se remueve del mapeado
expenseMap.remove(id);
Uri existingUri = ContractParaDatos.CONTENT_URI_PRODUCTO.buildUpon().appendPath(id).build();
// Comprobar si el producto necesita ser actualizado
boolean b = match.nombrePrd != null && !match.nombrePrd.equals(nombre);
boolean b1 = match.precioPrd != precio;
boolean b2 = match.IVA != iva;
if (b || b1 || b2)
{
Log.i(TAG, "Programando actualización de: " + existingUri);
ops.add(ContentProviderOperation.newUpdate(existingUri)
.withValue(ContractParaDatos.ColumnasProducto.PRODUCTO, match.nombrePrd)
.withValue(ContractParaDatos.ColumnasProducto.PRECIO, match.precioPrd)
.withValue(ContractParaDatos.ColumnasProducto.IVA, match.IVA)
.build());
syncResult.stats.numUpdates++;
} else {
Log.i(TAG, "No hay acciones para este registro: " + existingUri);
}
} else {
// Debido a que la entrada no existe, es removida de la base de datos
Uri deleteUri = ContractParaDatos.CONTENT_URI_PRODUCTO.buildUpon()
.appendPath(id).build();
Log.i(TAG, "Programando eliminación de: " + deleteUri);
ops.add(ContentProviderOperation.newDelete(deleteUri).build());
syncResult.stats.numDeletes++;
}
}
c.close();
// Insertar items resultantes
for (Producto e : expenseMap.values())
{
Log.i(TAG, "Programando inserción de: " + e.idProducto);
ops.add(ContentProviderOperation.newInsert(ContractParaDatos.CONTENT_URI_PRODUCTO)
.withValue(ContractParaDatos.ColumnasProducto.ID_REMOTA, e.idProducto)
.withValue(ContractParaDatos.ColumnasProducto.PRODUCTO, e.nombrePrd)
.withValue(ContractParaDatos.ColumnasProducto.PRECIO, e.precioPrd)
.withValue(ContractParaDatos.ColumnasProducto.IVA, e.IVA)
.build());
syncResult.stats.numInserts++;
}
if (syncResult.stats.numInserts > 0 ||
syncResult.stats.numUpdates > 0 ||
syncResult.stats.numDeletes > 0) {
Log.i(TAG, "Aplicando operaciones...");
try
{
resolver.applyBatch(ContractParaDatos.AUTHORITY, ops);
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
}
resolver.notifyChange(
ContractParaDatos.CONTENT_URI_PRODUCTO,
null,
false);
Log.i(TAG, "Sincronización finalizada.");
Toast.makeText(context, "Termino", Toast.LENGTH_LONG).show();//<-----------------------------------------------------
//////////////////////////////////////////////////////77777
try {
pre(context, j);
} catch (IOException e) {
e.printStackTrace();
}
////////////////////////////////////////////////////////
} else {
Log.i(TAG, "No se requiere sincronización");
}
}
public static void sincronizarAhora(Context context, boolean onlyUpload, boolean rutas)
{
int j=2;
Log.i(TAG, "Realizando petición de sincronización manual");
Toast.makeText(context, "Cargando Datos", Toast.LENGTH_LONG).show();//<-----------------------------------------------------
try {
pre(context, j);
} catch (IOException e) {
e.printStackTrace();
}
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContractParaDatos.NUMERO_RUTA, rutas);
if (onlyUpload)
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
ContentResolver.requestSync(obtenerCuentaASincronizar(context),
context.getString(R.string.provider_authority), bundle);
}
public static void pre(Context context, int i) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException
{
ProgressDialog mProgressDialog;
mProgressDialog = new ProgressDialog(context);
if (i==2)
{
mProgressDialog.setTitle("Cargando Anuncios");
mProgressDialog.setMessage("Espere un momento...");
mProgressDialog.show();
}
else if (i==3 || mProgressDialog.isShowing())
{
mProgressDialog.dismiss();
}
}
答案 0 :(得分:1)
为什么要在pre()
方法中创建新的进度对话框?你不应该宣布它是全球性的,然后在任何地方使用它。
答案 1 :(得分:1)
首先,您必须在类范围内声明progressDialog,并将其实例化一次,以下代码为您完成所有工作。 如果你没有具有上下文的android组件,你可以将上下文传递给你的方法或类构造函数。
public void showProgressDialog(String message) {
if (progressDialog != null && progressDialog.isShowing()){
progressDialog.setMessage(message);
} else {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setMessage(message);
try {
progressDialog.show();
} catch (final IllegalArgumentException ignored) {
// java.lang.IllegalArgumentException: View not attached to window manager
// has leaked window
}
}
}
public void dismissProgressDialog(){
if (progressDialog != null && progressDialog.isShowing()){
try {
progressDialog.dismiss();
} catch (final IllegalArgumentException ignored) {
// java.lang.IllegalArgumentException: View not attached to window manager
// has leaked window
}
progressDialog = null;
}
}
答案 2 :(得分:0)
尝试在主线程/活动中实例化ProgressDialog,例如@Yashasvi告诉
private static ProgressDialog mProgressDialog;
// Main thread/activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("Cargando Anuncios");
mProgressDialog.setMessage("Espere un momento...");
}
public static void pre(Context context, int i) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException
{
if (i==2)
{
mProgressDialog.show();
}
else if (i==3 || mProgressDialog.isShowing())
{
mProgressDialog.dismiss();
}
}
完整解决方案
import android.app.ProgressDialog;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.IOException;
public class Main2Activity extends AppCompatActivity {
private static ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("Cargando Anuncios");
mProgressDialog.setMessage("Espere un momento...");
try {
pre(this, 2);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void pre(Context context, int i) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException
{
if (i==2)
{
mProgressDialog.show();
}
else if (i==3 || mProgressDialog.isShowing())
{
mProgressDialog.dismiss();
}
}
}