为了账号安全,请及时绑定邮箱和手机立即绑定

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;
    }
}

注释掉的就是写一句话来代替时钟文本的。

谢谢。

正在回答

2 回答

一秒钟还来不及从网上获取那就话的内容,而且你用的是okhttp的异步执行,所以并不是先网络获取数据再更新组件,而是更新组件和网络获取会同时进行,所以你应该在GetContent类里用Handler来接收获取到的数据并更新组件。再service里的更新频率降低点,1秒一句话你看都看不过来

0 回复 有任何疑惑可以回复我~
#1

Omooo 提问者

非常感谢!
2018-05-30 回复 有任何疑惑可以回复我~

Service注释的应该是下面这样的,打错了:) 问题还是没解决。。

//每日一句
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);


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android-Widget桌面小组件
  • 参与学习       29582    人
  • 解答问题       31    个

Android-Widget桌面小组件的使用,带你实现多个小组件功能

进入课程

Widget的一个小问题。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信