Widget的一個小問題。
我并不想做一個時鐘的小組件,我想把網上的一句話來代替時鐘文本,所以我寫好了一個類,用于爬網上的一些句子,但是我在Service里面實例化來取這個字符串的時候并沒有成功,很是奇怪,我想問一下為什么呢?時鐘的組件運行是沒有問題的,而一句話運行的時候沒有結果。
下面是封裝的網絡請求類:
package?com.example.ssc.oneget; import?android.util.Log; import?org.jsoup.Jsoup; import?org.jsoup.nodes.Document; import?org.jsoup.select.Elements; import?java.io.IOException; import?okhttp3.Call; import?okhttp3.Callback; import?okhttp3.OkHttpClient; import?okhttp3.Request; import?okhttp3.Response; /** ?*?Created?by?SSC?on?2017/9/16. ?*/ public?class?GetContent?{ ????String?content; ????public?String?getContentValue(String?url)?{ ????????OkHttpClient?mClient?=?new?OkHttpClient(); ????????final?Request?request?=?new?Request.Builder() ????????????????.url(url) //????????????????.addHeader("User-Agent","Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/55.0.2883.87?Safari/537.36") //????????????????.addHeader("Cookie","ICIBA_HUAYI_COOKIE=1;?UM_distinctid=15e88d42c6e4a5-032081ce67094e-5d4e211f-1fa400-15e88d42c6f3b8;?PHPSESSID=5su1hqc2rqfmm027eqou523pp0;?testnews_iciba_user=15;?CNZZDATA1256573685=1319828842-1505532611-http%253A%252F%252Fwww.so.com%252F%7C1505532611") //????????????????.addHeader("Cache-Control","max-age=0") ????????????????.build(); ????????Call?call?=?mClient.newCall(request); ????????call.enqueue(new?Callback()?{ ????????????@Override ????????????public?void?onFailure(Call?call,?IOException?e)?{ ????????????} ????????????@Override ????????????public?void?onResponse(Call?call,?Response?response)?throws?IOException?{ ????????????????String?result?=?response.body().string(); ????????????????Log.i("2333---result",?result); ????????????????Document?document?=?Jsoup.parse(result); ????????????????Elements?elements?=?document.select("strong[style*=\"color:?#0b5394;\"]"); ????????????????int?size?=?elements.size(); ????????????????content?=?elements.get(0).text().toString(); ????????????????Log.i("2333---content+?size",?content?+?"?"?+?size); //????????????????for?(int?i?=?0;?i?<size?;?i++)?{ // //????????????????} ????????????} ????????}); ????????return?content; ????} }
下面是Service類:
package?com.example.ssc.oneget; import?android.app.Service; import?android.appwidget.AppWidgetManager; import?android.content.ComponentName; import?android.content.Intent; import?android.os.IBinder; import?android.support.annotation.Nullable; import?android.widget.RemoteViews; import?java.text.SimpleDateFormat; import?java.util.Date; import?java.util.Timer; import?java.util.TimerTask; /** ?*?Created?by?SSC?on?2017/9/16. ?*/ public?class?MyService?extends?Service?{ ????private?Timer?mTimer; ????private?SimpleDateFormat?mFormat?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss"); ????@Nullable ????@Override ????public?IBinder?onBind(Intent?intent)?{ ????????return?null; ????} ????@Override ????public?void?onCreate()?{ ????????super.onCreate(); ????????mTimer?=?new?Timer(); ????????mTimer.schedule(new?TimerTask()?{ ????????????@Override ????????????public?void?run()?{ ????????????????updateViews(); ????????????} ????????},0,1000); ????} ????private?void?updateViews()?{ ????????//時鐘小組件 ????????String?time?=?mFormat.format(new?Date()); ????????RemoteViews?remoteViews?=?new?RemoteViews(getPackageName(),?R.layout.widget); ????????remoteViews.setTextViewText(R.id.textView1,?time); ????????AppWidgetManager?manager?=?AppWidgetManager.getInstance(getApplicationContext()); ????????ComponentName?componentName?=?new?ComponentName(getApplicationContext(),?WidGetProvider.class); ????????manager.updateAppWidget(componentName,remoteViews); //????????//每日一句 //????????GetContent?getContent?=?new?GetContent(); //????????int?num?=?(int)?(Math.random()?*?300?+?1); //????????String?url?=?"http://www.dailyenglishquote.com/page/"?+?num?+?"/"; //????????String?content?=?getContent.getContentValue(url); //????????RemoteViews?remoteViews?=?new?RemoteViews(getPackageName(),?R.layout.widget); //????????remoteViews.setTextViewText(R.id.textView1,?content); //????????AppWidgetManager?manager?=?AppWidgetManager.getInstance(getApplicationContext()); //????????ComponentName?componentName?=?new?ComponentName(getApplicationContext(),?WidGetProvider.class); //????????manager.updateAppWidget(componentName,remoteViews); ????} ????@Override ????public?void?onDestroy()?{ ????????super.onDestroy(); ????????mTimer?=?null; ????} }
注釋掉的就是寫一句話來代替時鐘文本的。
謝謝。
2018-05-30
一秒鐘還來不及從網上獲取那就話的內容,而且你用的是okhttp的異步執行,所以并不是先網絡獲取數據再更新組件,而是更新組件和網絡獲取會同時進行,所以你應該在GetContent類里用Handler來接收獲取到的數據并更新組件。再service里的更新頻率降低點,1秒一句話你看都看不過來
2017-09-16
Service注釋的應該是下面這樣的,打錯了:) 問題還是沒解決。。