4

您好,感谢您的帮助,我有一个在 Eclipse 中针对 API 17 编译的应用程序。

该应用程序执行一些简单的互联网连接。

现在,当我使用 API 17 在模拟器上进行测试时,一切正常。

如果我针对具有 API 8 的模拟器对其进行测试,则应用程序显然无法执行网络连接(adMob 不显示,HttpGet 显然没有检索任何内容......)形成我的应用程序(模拟器上的网络浏览器工作正常并正常加载)。


并且 adMob 也不会在具有 API 8 或 10 的模拟器上加载(它会在 API 17 模拟器上加载)。


非常感谢任何帮助!

这是我的主要活动:

public class QuotesActivity extends Activity implements MyInterface {

private String url2;

public static ArrayList<Stock> lt;
public static ArrayList<Stock> favQ;

public MyAdapter myAdap;

public Intent intent;
public ListView lv;
public FavManager fm;
private AdView adView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.search);
    AdRequest request = new AdRequest();

    // request.addTestDevice(AdRequest.TEST_EMULATOR);
    request.setGender(AdRequest.Gender.MALE);
    boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
    if (tabletSize) {
        // Create the adView
        adView = new AdView(this, AdSize.SMART_BANNER, "a151388079e47d1");
    } else {
        // Create the adView
        adView = new AdView(this, AdSize.BANNER, "a151388079e47d1");
    }

    // Lookup your LinearLayout assuming it's been given
    // the attribute android:id="@+id/mainLayout"
    LinearLayout layout = (LinearLayout) findViewById(R.id.ad);

    // Add the adView to it
    layout.addView(adView);

    // Initiate a generic request to load it with an ad
    adView.loadAd(request);

    lt = new ArrayList<Stock>();
    favQ = new ArrayList<Stock>();
    fm = new FavManager(getApplicationContext());
    favQ.clear();
    favQ.addAll(fm.ritiraFav());
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    lt.clear();
    // ////////////
    try {
        InputStream in = getResources().openRawResource(R.raw.markets3);

        if (in != null) {
            InputStreamReader tmp = new InputStreamReader(in);
            BufferedReader reader = new BufferedReader(tmp);
            String str;
            String str1 = null;
            String str2 = null;
            boolean flag = true;
            while ((str = reader.readLine()) != null) {
                if (flag) {
                    str1 = str;
                    flag = false;
                } else {
                    str2 = str;
                    lt.add(new Stock(str1, str2, "0", "0"));
                    flag = true;
                }
            }
            in.close();
        }
    }

    catch (Throwable t) {
        // Log.e("", "Exception: " + t.toString());
    }
    // ///////
    Collections.sort(lt, new Comparator<Stock>() {
        public int compare(Stock s1, Stock s2) {
            return s1.nome.compareToIgnoreCase(s2.nome);
        }
    });
    lv = (ListView) findViewById(android.R.id.list);
    lv.setScrollbarFadingEnabled(false);
    Button favourites = (Button) findViewById(R.id.favoritesbtn);
    favourites.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(QuotesActivity.this,
                    QuotesActivityFavourites.class);
            startActivity(intent);

        }
    });

    Button search = (Button) findViewById(R.id.googsearch);
    search.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // Log.e("", "Chiamo onSearchRequested()");
            onSearchRequested();

        }
    });

    myAdap = new MyAdapter(lt, this, this);
    myAdap.l = lt;
    lv.setAdapter(myAdap);

    Button preference = (Button) findViewById(R.id.preferencebutton);
    preference.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(QuotesActivity.this,
                    SettingsActivity.class);
            startActivity(intent);

        }
    });

    lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                final int position, long id) {
            for (Stock item : favQ) {
                if (item.simbolo.equals(lt.get(position).simbolo)) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(
                            QuotesActivity.this);
                    builder.setPositiveButton("Yes", new OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                            deleteFromFavorites(lt.get(position));
                        }
                    });
                    builder.setNegativeButton("No", new OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                            // Quotes.layoutSchermo(2);
                        }
                    });
                    builder.setMessage("Stock Already in Portfolio. Delete from it?");
                    builder.setTitle(lt.get(position).nome);

                    AlertDialog dialog = builder.create();
                    builder.show();
                    return;
                }

            }

            AlertDialog.Builder builder = new AlertDialog.Builder(
                    QuotesActivity.this);
            final int pos = position;

            builder.setPositiveButton("Yes", new OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    addToFavorites(lt.get(pos));
                }
            });
            builder.setNegativeButton("No", new OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    // Quotes.layoutSchermo(2);
                }
            });
            builder.setMessage("Add to Portfolio?");
            builder.setTitle(lt.get(position).nome);
            AlertDialog dialog = builder.create();
            builder.show();
            // dialog.show();
        }
    });

}

@Override
public void onResume() {
    super.onResume();
    RelativeLayout focuslayout = (RelativeLayout) findViewById(R.id.RequestFocusLayout);
    focuslayout.requestFocus();
    favQ.clear();
    favQ.addAll(fm.ritiraFav());
}

public void addToFavorites(final Stock toadd) {

    fm.addFav(toadd);
    favQ.clear();
    favQ.addAll(fm.ritiraFav());
    return;
}

public void deleteFromFavorites(Stock todel) {
    fm.removeFav(todel);
    favQ.clear();
    favQ.addAll(fm.ritiraFav());
    return;
}

public void UpdateLine(Integer position) {
    UpdateTask up = new UpdateTask();
    up.execute(position, null, null);
}

public class UpdateTask extends AsyncTask<Integer, Void, Void> {

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

    @Override
    protected void onPostExecute(Void result) {
        myAdap.l = lt;
        myAdap.notifyDataSetChanged();
    }

    @Override
    protected Void doInBackground(Integer... position) {
        DefaultHttpClient client = new DefaultHttpClient();
        String srt = "";
        // ///////////API SEGRETO DI GOOGLE ORIGINARIO
        // String url
        // =getString(R.string.dettaglio1).concat("'"+fav.get(i).simbolo+"'").concat(getString(R.string.dettaglio2));
        // ///////////API ALTERNATIVO
        String url = getString(R.string.urlaternativo).concat(
                lt.get(position[0]).simbolo);

        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);
            lt.get(position[0]).setPrezzo(srt.substring(inizio + 12, fine));

            inizio = srt.indexOf("<perc_change data=\"");
            fine = srt.indexOf("\"/>", inizio + 19);
            lt.get(position[0]).setCambiamento(
                    srt.substring(inizio + 19, fine));

        } catch (Throwable t) {
            // Log.e("ERRORE INTERNET", "ERRORE INTERNET", t);
        }

        return null;
    }
}

@Override
public void onDestroy() {
    if (adView != null) {
        adView.destroy();
    }
    super.onDestroy();
}
}

这是我的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.quotes" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application android:debuggable="true" >
    <activity
        android:name=".QuotesActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:icon="@drawable/ic_launcher"
        android:label="Markets in your pocket !" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".QuotesActivitySearch" />
    </activity>
    <activity
        android:name=".QuotesActivitySearch"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:icon="@drawable/ic_launcher"
        android:label="Markets in your pocket !" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>
    <activity
        android:name=".QuotesActivityFavourites"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:icon="@drawable/ic_launcher"
        android:label="Markets in your pocket !" >
    </activity>
    <activity
        android:name=".SettingsActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="Settings" >
    </activity>
    <activity
        android:name="com.google.ads.AdActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
</application>

这是我的 LogCat:

03-15 14:16:05.554: D/dalvikvm(1466): GC_EXPLICIT freed 909K, 43% free 4716K/8135K,    external 1170K/1682K, paused 7ms
03-15 14:16:07.185: E/ActivityThread(1466): Failed to find provider info for    com.google.plus.platform
03-15 14:16:07.185: D/szipinf(1466): Initializing inflate state
03-15 14:16:07.185: D/szipinf(1466): Initializing zlib to inflate
03-15 14:16:07.214: I/Ads(1466): To get test ads on this device, call    adRequest.addTestDevice("6EA1DCF3A944D7B947BC304C7A9E933D");
03-15 14:16:07.268: D/dalvikvm(1466): GC_CONCURRENT freed 395K, 36% free 5315K/8263K,    external 1121K/1603K, paused 1ms+0ms
03-15 14:16:07.290: I/Ads(1466): adRequestUrlHtml: <html><head><script     src="http://media.admob.com/sdk-core-v40.js"></script>   <script>AFMA_getSdkConstants();AFMA_buildAdURL({"preqs":3,"session_id":"1145804483122245265 2","seq_num":"4","slotname":"a151388079e47d1","u_w":320,"msid":"com.marketsinyourpocket","cap":"m,a","js":"afma-sdk-a-    v6.3.0","bas_off":0,"net":"ed","app_name":"1.android.com.marketsinyourpocket","hl":"en","gnt":3,"cust_gender":1,"carrier":"310260","u_audio":1,"u_sd":1.5,"ms":"Qqlgt9Kwv7BZOnio6PfLHi5mVs5ayp77VGIIyJ3Y7sojTNwIZfi0LHn2PZquoJTqpJx8NtOvTzGKWYlbxvU8fOjXkArCoqoQnGrLKZ57CTZOOt2WWrL9k8pyN4P-nBwIvuZDvijR0reHDyhcqwAoMtPdOeUV_cwIe3jk-6BMm_IgvGs8EKWVZESeqrSuExAStQMMsUYcC6p-XkB8KegxEX4FS2Q2CibdMk3CMKoAzfF58Sxp6DvRObm662IVwImzFWGdQ22UVx4ViQqz_ensdg1bXk5jgpyBOpV0jMFHgoEv5SwD5zpoeJfo-a1f0d5GR35f2bDAb3iXucuGB723lA","isu":"6EA1DCF3A944D7B947BC304C7A9E933D","format":"320x50_mb","oar":0,"ad_pos":{"height":0,"visible":0,"y":0,"x":0,"width":0},"u_h":533,"pt":1,"bas_on":0,"ptime":143736});</script></head><body></body></html>
03-15 14:16:07.358: W/webcore(1466): Can't get the viewWidth after the first layout
03-15 14:16:07.448: D/dalvikvm(1466): GC_CONCURRENT freed 338K, 33% free 6141K/9031K,  external 1121K/1603K, paused 1ms+0ms
03-15 14:16:13.494: V/URL I USE(1466): http://www.google.com/ig/api?stock=SHY
03-15 14:16:33.614: E/EXCEPTION I GET(1466): java.net.UnknownHostException: www.google.com

编辑 编辑 编辑 编辑

甚至在 API 10 Intel 加速仿真器上进行了尝试,但没有更好的运气 请参阅模拟器配置

代理设置正确,

启用数据传输

……我有点绝望!

编辑 编辑 编辑

发布了整个活动

编辑 编辑 编辑

该应用程序可以在具有 API 10 的真实电话上正常工作(而不是在我的具有 API 10 的模拟器上)!!!

我发现的错误是

03-15 13:14:43.299: E/Exception(1318): java.net.UnknownHostException: www.google.com

确实我使用了 Google REST 服务

谢谢你的帮助!

4

5 回答 5

3

我很确定这是代理设置问题。尝试显式设置代理(从 Android 系统获取值)。

在默认的 HttpClient 上,这将是:

HttpClient client = new DefaultHttpClient();

//Get the default settings from APN
  String proxyHost = android.net.Proxy.getDefaultHost();
  int proxyPort = android.net.Proxy.getDefaultPort();
//Set Proxy params of client, if they are not the standard
    if (proxyHost != null && proxyPort > 0) {
        HttpHost proxy = new HttpHost(proxyHost, proxyPort);
        client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    }
HttpGet request = new HttpGet("http://www.google.com");
于 2013-03-15T23:53:49.967 回答
1

也许模拟器中的互联网已关闭?顶部应该有一个3G小图标,尝试按F8,它会打开和关闭它。

于 2013-03-08T08:46:04.810 回答
1

猜测:

  • “代理设置正确”尝试不设置任何代理。
  • 尝试使用另一个 cpu 而不是 intel atom
于 2013-03-11T20:55:56.053 回答
1

由于网络访问适用于 AVD 的浏览器,因此我将关注问题的其他潜在来源。

如果我是你,我会简单地尝试针对 API 8 进行编译。当你这样做时,你将被指向你在代码中使用的任何方法和其他构造,这些方法和其他构造不适用于 API 8。(你没有提供所有代码,例如 MyAdapter 中可能隐藏了一些东西。此外,您还没有提到您的catch日志消息是否出现在 LogCat 中。)

另一个可能值得关注的方面是您没有正确使用 AsyncTask,并且它在不同的 API 版本上的行为会有所不同。

根据 API 版本,当您没有明确选择 Executor 时,您的 AsyncTask 将按顺序或并行运行,从而导致许多或很少的 http 连接,并导致对数据结构的并发操作。

您只能在主/UI 线程上操作您的适配器。否则,例如当用户滚动您的列表时,UI 将调用您的适配器的 getView(),这可能会被您的 AsyncTask 中断,修改当前由 getView() 处理的条目,从而导致不一致和/或崩溃。

您已尝试通过lt异步操作和调用myAdap.l = ltUI 线程来实现此目的。

这是个好主意,但它有两个问题。首先,在 API 8 上,许多 AsyncTask 可以并行运行,而在 API 17 上只能是一个。报价

从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

因此,在某些版本的 Android 上,您会遇到一个竞争条件,在该条件下,副本lt将被并行操作,从而导致分配时数据丢失。如果这些是实际的副本,那就是——它们不是。通过lt在它已被分配为适配器的底层数据结构时进行异步操作,您打破了不异步操作 UI 对象的规则。

因此,您需要将获取的数据从doInBackgroundto传递onPostExecute并在那里更新 Adapter 的数据结构。

我提到的两点可能不是问题的最终原因,但它们很可能会导致观察到的行为,无论如何都需要解决,并且可以更容易地识别任何其他潜在的根本原因。

希望这可以帮助。

更新您也可能以错误的方式使用 HttpClient。例如,请参见此处。也许并非所有 API 级别都(正确)支持所有组合(过去有几个错误)。您可能还想阅读Android 的 HTTP 客户端

于 2013-03-15T06:28:44.153 回答
1

如果你是在eclipse中开发,可以试试

窗口>首选项>Android>启动

默认模拟器选项:-dns-server 8.8.8.8,8.8.4.4

编辑:

转到:运行->运行配置-> android应用程序

然后选择您的项目 -> 目标,向下滚动选项页面并将 -dns-server 8.8.8.8,8.8.4.4 粘贴到 Additional Emulator Command Line Options

于 2013-03-15T11:15:27.723 回答