1

复活节快乐

并提前非常感谢您的帮助。

我有一个应用程序小部件,每 1 分钟通过服务更新一次。

该服务需要几秒钟来更新小部件,因为它从互联网收集数据。

问题在于,在更新期间,App Widget 本身会在几秒钟内被完全不同的图像替换(请参见下面的图像),然后它会返回其正常状态。

这是小部件的正常外观:

在此处输入图像描述

这是更新期间发生的事情!

在此处输入图像描述

几秒钟后一切又好了:

在此处输入图像描述

请就如何避免这种情况提出任何建议,非常欢迎!!

我曾尝试以某人在这篇文章中所做的方式自我停止服务:Android Widget 在更新期间显示奇怪的图像

但没有成功。

这是更新 App Widget 的服务的全部代码(我怀疑它会不会有很大帮助)

public class UpdateService extends Service {

public RemoteViews updateViews;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e("", "onStartCommand di AppWidget");
    int[] appWidgetIds = intent.getIntArrayExtra("widgetsids");
    final int N = appWidgetIds.length;
    AppWidgetManager manager = AppWidgetManager.getInstance(this);

    // Perform this loop procedure for each App Widget that belongs to
    // this provider

    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];
        Log.e("", "i=" + Integer.toString(i) + " di " + Integer.toString(N));
        RemoteViews view = buildUpdate(getApplicationContext(),
                appWidgetIds);

        // Tell the AppWidgetManager to perform an update on the current
        // app widget
        manager.updateAppWidget(appWidgetId, view);

    }
    stopSelf();
    Log.e("","stoopo il service");
    return (START_STICKY);


}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

private RemoteViews buildUpdate(Context ctxt, int[] appWidgetIds) {
    updateViews = new RemoteViews(ctxt.getPackageName(), R.layout.widget);
    Log.e("", "invoco buildbpdate");
    Intent intent = new Intent(ctxt, AppWidgetConfigure.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(ctxt, 0,
            intent, 0);
    updateViews.setOnClickPendingIntent(R.id.Widgetbackground,
            pendingIntent);

    DatabaseHandler db = new DatabaseHandler(getApplicationContext());

    ArrayList<Stock> list = db.getAllStocks();
    if (!list.isEmpty())
        Collections.sort(list, new Comparator<Stock>() {
            public int compare(Stock s1, Stock s2) {
                return s1.getName().compareToIgnoreCase(s2.getName());
            }
        });
    Log.e("", "inizio ad aggiornare");
    // PRIMO
    if (list.size() >= 1) {
        String nome = list.get(0).getName();
        if (nome.length() >= 12)
            nome = nome.substring(0, 12);
        updateViews.setTextViewText(R.id.name1, nome);
        Log.e("list.get(1).getName()", list.get(0).getName());

        UpdateTaskPrice up = new UpdateTaskPrice();
        up.execute(list.get(0).getSymbol(), null, null);
        String res = "";
        try {
            res = up.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", res);
        updateViews.setTextViewText(R.id.price1, res);

        UpdateTaskChange chn = new UpdateTaskChange();
        chn.execute(list.get(0).getSymbol(), null, null);
        String reschn = "";
        try {
            reschn = chn.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", reschn);
        updateViews.setTextViewText(R.id.change1, reschn+"%");
        if (Float.valueOf(reschn) < 0) {
            updateViews.setTextViewText(R.id.arrow1, "\u25BC");
            updateViews.setTextColor(R.id.change1, Color.RED);
            updateViews.setTextColor(R.id.arrow1, Color.RED);
        }
        if (Float.valueOf(reschn) > 0) {
            updateViews.setTextViewText(R.id.arrow1, "\u25B2");
            updateViews.setTextColor(R.id.change1, Color.GREEN);
            updateViews.setTextColor(R.id.arrow1, Color.GREEN);
        }
    }
    Log.e("", "faccio primo giro di aggiornamento");
    // SECONDO
    if (list.size() >= 2) {
        String nome = list.get(1).getName();
        if (nome.length() >= 12)
            nome = nome.substring(0, 12);
        updateViews.setTextViewText(R.id.name2, nome);

        UpdateTaskPrice up = new UpdateTaskPrice();
        up.execute(list.get(1).getSymbol(), null, null);
        String res = "";
        try {
            res = up.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", res);
        updateViews.setTextViewText(R.id.price2, res);

        UpdateTaskChange chn = new UpdateTaskChange();
        chn.execute(list.get(1).getSymbol(), null, null);
        String reschn = "";
        try {
            reschn = chn.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", reschn);
        updateViews.setTextViewText(R.id.change2, reschn+"%");
        if (Float.valueOf(reschn) < 0) {
            updateViews.setTextViewText(R.id.arrow2, "\u25BC");
            updateViews.setTextColor(R.id.change2, Color.RED);
            updateViews.setTextColor(R.id.arrow2, Color.RED);
        }
        if (Float.valueOf(reschn) > 0) {
            updateViews.setTextViewText(R.id.arrow2, "\u25B2");
            updateViews.setTextColor(R.id.change2, Color.GREEN);
            updateViews.setTextColor(R.id.arrow2, Color.GREEN);
        }
    }

    // TERZO
    if (list.size() >= 3) {
        String nome = list.get(2).getName();
        if (nome.length() >= 12)
            nome = nome.substring(0, 12);
        updateViews.setTextViewText(R.id.name3, nome);

        UpdateTaskPrice up = new UpdateTaskPrice();
        up.execute(list.get(2).getSymbol(), null, null);
        String res = "";
        try {
            res = up.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", res);
        updateViews.setTextViewText(R.id.price3, res);

        UpdateTaskChange chn = new UpdateTaskChange();
        chn.execute(list.get(2).getSymbol(), null, null);
        String reschn = "";
        try {
            reschn = chn.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", reschn);
        updateViews.setTextViewText(R.id.change3, reschn+"%");
        if (Float.valueOf(reschn) < 0) {
            updateViews.setTextViewText(R.id.arrow3, "\u25BC");
            updateViews.setTextColor(R.id.change3, Color.RED);
            updateViews.setTextColor(R.id.arrow3, Color.RED);
        }
        if (Float.valueOf(reschn) > 0) {
            updateViews.setTextViewText(R.id.arrow3, "\u25B2");
            updateViews.setTextColor(R.id.change3, Color.GREEN);
            updateViews.setTextColor(R.id.arrow3, Color.GREEN);
        }
    }
    // QUARTO
    if (list.size() >= 4) {
        String nome = list.get(3).getName();
        if (nome.length() >= 12)
            nome = nome.substring(0, 12);
        updateViews.setTextViewText(R.id.name4, nome);

        UpdateTaskPrice up = new UpdateTaskPrice();
        up.execute(list.get(3).getSymbol(), null, null);
        String res = "";
        try {
            res = up.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", res);
        updateViews.setTextViewText(R.id.price4, res);

        UpdateTaskChange chn = new UpdateTaskChange();
        chn.execute(list.get(3).getSymbol(), null, null);
        String reschn = "";
        try {
            reschn = chn.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", reschn);
        updateViews.setTextViewText(R.id.change4, reschn+"%");
        if (Float.valueOf(reschn) < 0) {
            updateViews.setTextViewText(R.id.arrow4, "\u25BC");
            updateViews.setTextColor(R.id.change4, Color.RED);
            updateViews.setTextColor(R.id.arrow4, Color.RED);
        }
        if (Float.valueOf(reschn) > 0) {
            updateViews.setTextViewText(R.id.arrow4, "\u25B2");
            updateViews.setTextColor(R.id.change4, Color.GREEN);
            updateViews.setTextColor(R.id.arrow4, Color.GREEN);
        }
    }
    // QUINTO
    if (list.size() >= 5) {
        String nome = list.get(4).getName();
        if (nome.length() >= 12)
            nome = nome.substring(0, 12);
        updateViews.setTextViewText(R.id.name5, nome);

        UpdateTaskPrice up = new UpdateTaskPrice();
        up.execute(list.get(4).getSymbol(), null, null);
        String res = "";
        try {
            res = up.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", res);
        updateViews.setTextViewText(R.id.price5, res);

        UpdateTaskChange chn = new UpdateTaskChange();
        chn.execute(list.get(4).getSymbol(), null, null);
        String reschn = "";
        try {
            reschn = chn.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("risultato di get è ", reschn);
        updateViews.setTextViewText(R.id.change5, reschn+"%");
        if (Float.valueOf(reschn) < 0) {
            updateViews.setTextViewText(R.id.arrow5, "\u25BC");
            updateViews.setTextColor(R.id.change5, Color.RED);
            updateViews.setTextColor(R.id.arrow5, Color.RED);
        }
        if (Float.valueOf(reschn) > 0) {
            updateViews.setTextViewText(R.id.arrow5, "\u25B2");
            updateViews.setTextColor(R.id.change5, Color.GREEN);
            updateViews.setTextColor(R.id.arrow5, Color.GREEN);
        }
    }
    return (updateViews);
}

public class UpdateTaskPrice extends AsyncTask<String, String, String> {
    public String res;

    @Override
    protected void onProgressUpdate(String... progress) {
    }

    @Override
    protected void onPostExecute(String result) {
    }

    @Override
    protected String doInBackground(String... symbol) {
        Log.e("", "Passo per doinbabground");
        String result = "";
        DefaultHttpClient client = new DefaultHttpClient();
        String srt = "";
        String url = getApplicationContext().getString(
                R.string.urlaternativo).concat(symbol[0]);
        HttpGet getMethod = new HttpGet(url);
        try {
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            srt = client.execute(getMethod, responseHandler);
            int inizio = srt.indexOf("<last data=\"");
            int fine = srt.indexOf("\"/>", inizio + 12);
            result = srt.substring(inizio + 12, fine);

        } catch (Throwable t) {
            // Log.e("ERROR", "ERROR", t);
        }
        Log.e("", "finisco per doinbabground");
        return result;
    }
}

public class UpdateTaskChange extends AsyncTask<String, String, String> {
    public String res;

    @Override
    protected void onProgressUpdate(String... progress) {
    }

    @Override
    protected void onPostExecute(String result) {
    }

    @Override
    protected String doInBackground(String... symbol) {
        Log.e("", "Passo per doinbabground");
        String result = "";
        DefaultHttpClient client = new DefaultHttpClient();
        String srt = "";
        String url = getApplicationContext().getString(
                R.string.urlaternativo).concat(symbol[0]);
        HttpGet getMethod = new HttpGet(url);
        try {
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            srt = client.execute(getMethod, responseHandler);

            int inizio = srt.indexOf("<perc_change data=\"");
            int fine = srt.indexOf("\"/>", inizio + 19);
            result = srt.substring(inizio + 19, fine);

        } catch (Throwable t) {
            // Log.e("ERROR", "ERROR", t);
        }
        Log.e("", "finisco per doinbabground");
        return result;
    }
}

 }

多谢!!!

4

1 回答 1

0

AppWidgetProvider有方法onReceiver来接收广播动作。从服务的更改数据,您sendbroadcast将数据更改为小部件。AppWidgetProvider为in注册此广播的接收者AndroidManifest。类扩展AppWidgetProvider将接收更改数据和小部件通过它自己的方法更新它'UionUpdate(....)

于 2014-05-13T09:40:32.993 回答