Widget的HttpURLConnection超时而未打开应用

时间:2018-10-03 21:37:59

标签: android httpurlconnection

我正在为我的手机编写一个android主屏幕小部件,当触摸该小部件时会打开一个URL。就是这样,URL是硬编码的,从理论上讲,我不必打开实际的应用程序。实际的应用仅显示世界问候消息,仅此而已。

不幸的是,我的HttpURLConnection偶尔会超时。

我做什么:
在我的应用中,我有一个小部件,直到被触摸之前它什么也不做。触摸它时,将打开一个URL并根据所访问文档的内容更改颜色。
我有一个扩展AppWidgetProvider的类,下面有完整的源代码。
我初始化RemoteViews并调用setOnClickPendingIntent
点击后,我启动一个Thread
在线程内部,我创建了一个HttpURLConnectionsetConnectTimeout(10000)来处理我的服务器是否关闭。
接下来,我通过调用getInputStream进行连接,这将超时。显式调用connect不会改变行为。

如何解决此问题:

  • 打开应用
  • 或插入连接到我的开发PC的USB电缆。这不会启动应用程序,但可能会将我的手机连接到Android Studio进行调试。

如何使问题再次出现:

  • 卸载该应用并重新安装,而无需打开它。在主屏幕上放置小部件,触摸它并观看它的超时。
  • 或等待。我不知道要几周到几个月。过了一会儿,问题又回来了。这使得复制和调试变得非常困难,尤其是因为一旦我连接USB即可读取调试消息,该问题便已修复。

所以,我不知道问题的真正原因是什么。没有有用的例外等,因为连接只是超时。它似乎与打开应用程序时进行的初始化有关,但我不知道。有什么想法吗?

我的小部件类的代码:

package [censored for privacy];

import [all the classes]

public class UnlockWidget extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    for(int i = 0; i < appWidgetIds.length; ++i)
    {
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.unlock_widget);
        remoteView.setOnClickPendingIntent(R.id.layout, getPendingSelfIntent(context, MyOnClick));
        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteView);
    }
}

public void onReceive(Context context, Intent intent)
{
    if (MyOnClick.equals(intent.getAction()))
    {
        final Context myContext = context;
        new Thread(new Runnable() {
            public void run() {

                RemoteViews views = new RemoteViews(myContext.getPackageName(), R.layout.unlock_widget);
                views.setInt(R.id.layout, "setBackgroundColor",
                        Color.argb(128, 0, 0, 255));
                views.setTextViewText(R.id.clicktext, "...");
                AppWidgetManager.getInstance(myContext).updateAppWidget(new ComponentName(
                        myContext, UnlockWidget.class), views);

                String result = new String();
                try
                {

                    boolean redo;
                    do
                    {
                        redo = false;
                        URL url = new URL("https://[censored for privacy]");
                        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                        urlConnection.setConnectTimeout(10000);
                        try {
                            Scanner s = new Scanner(new BufferedInputStream(urlConnection.getInputStream())).useDelimiter("\\A");
                            result = s.hasNext() ? s.next() : "fail";
                        } catch (java.net.SocketTimeoutException e) {
                            redo = true;
                        } finally {
                            urlConnection.disconnect();
                        }
                    }
                    while(redo);
                }
                catch(Exception e)
                {
                    result = e.toString();
                    e.printStackTrace();
                }

                if(result.startsWith("ok"))
                {
                    result = new String();
                    views.setInt(R.id.layout, "setBackgroundColor",
                            Color.argb(6, 0, 0, 0));
                    try {
                        Ringtone r = RingtoneManager.getRingtone(myContext, RingtoneManager.getDefaultUri(
                                RingtoneManager.TYPE_NOTIFICATION));
                        r.play();
                        Vibrator v = (Vibrator) myContext.getSystemService(Context.VIBRATOR_SERVICE);
                        v.vibrate(2000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                else
                {
                    views.setInt(R.id.layout, "setBackgroundColor",
                            Color.argb(64, 255, 0, 0));
                }

                views.setTextViewText(R.id.clicktext, result);
                AppWidgetManager.getInstance(myContext).updateAppWidget(new ComponentName(
                        myContext, UnlockWidget.class), views);

            }
        }).start();
    }
    else
        super.onReceive(context, intent);

};

private static final String MyOnClick = "myOnClickTag";

protected PendingIntent getPendingSelfIntent(Context context, String action)
{
    Intent intent = new Intent(context, getClass());
    intent.setAction(action);
    return PendingIntent.getBroadcast(context, 0, intent, 0);
}

@Override
public void onEnabled(Context context) {
}

@Override
public void onDisabled(Context context) {
}

}

0 个答案:

没有答案