0

一般来说,我是 android 开发和软件编程的新手,我相信我的应用程序中存在线程问题。该应用程序所做的是根据对 api 的两次查询搜索两组结果,并将每组结果存储在自己的列表中。将生成一个新列表,其中仅包含两个列表中的元素。该应用程序在我桌面上的虚拟设备中运行,但挂在我的 Galaxy Nexus 上。我为此使用了arraylist,但我想知道hashset是否会更快地完成这种类型的操作。以下是我的主要活动。getfirst 和 secondID 以及 getfirst 和 secondtitle 在 asynctask 中完成,以防止 networkonmainthread 异常。这是线程这个应用程序的最佳方式吗?谢谢你的帮助。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.totlayout);

    //set the UI elements
    searchOne = (EditText) findViewById(R.id.searchOne);
    searchTwo = (EditText) findViewById(R.id.searchTwo);

    findMovies = (Button) findViewById(R.id.findMovies);

    searchOne.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            //make person search url1
            final StringBuilder personSearchURLOne = new StringBuilder(getName.getName1(searchOne)); 
            searchURLOne = personSearchURLOne.toString();
            return false;
        }
    });

    searchTwo.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            //make person search url2
            final StringBuilder personSearchURLTwo = new StringBuilder(getName.getName2(searchTwo));
            searchURLTwo = personSearchURLTwo.toString();

            return false;
        }
    }); 
}
public void getData(String searchURLOne, String searchURLTwo){
    try{
        //get ID 1 
        idOne = new getFirstID().execute(searchURLOne).get();
        Log.d("JSONArray idOne", idOne.toString());

       //get ID 2
       idTwo = new getSecondID().execute(searchURLTwo).get();
       Log.d("JSONArray idTwo", idTwo.toString());

       //make credit search url1
       final StringBuilder creditURLOne = new StringBuilder(buildCreditURL.getCreditURLOne(idOne));
       final String creditOne = creditURLOne.toString(); 
       Log.d("creditOne contains", creditOne);

       //make credit search url2
       final StringBuilder creditURLTwo = new StringBuilder(buildCreditURL.getCreditURLTwo(idTwo));
       final String creditTwo = creditURLTwo.toString();

       //get array of tiles for credit url 1 
       titleOne = new getFirstTitle().execute(creditOne).get();
       Log.d("titleOne Contains", titleOne.toString());

       //get array of titles for credit url 2
       titleTwo = new getSecondTitle().execute(creditTwo).get();

       //parse out common films into new array 
       myCommonFilms = new ArrayList<String>(commonFilms.getCommonFilms(titleOne, titleTwo));
    }
    catch(InterruptedException e){
        e.printStackTrace();
    }catch(ExecutionException e){
        e.printStackTrace();
    }



}
public void displayResults(View view) throws InterruptedException, ExecutionException{
    //do something in response to button
    getData(searchURLOne, searchURLTwo);
    Intent intent = new Intent(this, DisplayResultsActivity.class).putStringArrayListExtra("myCommonFilmsList", myCommonFilms);
    startActivity(intent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.totlayout, menu);
    return true;
}
}
4

3 回答 3

0

这似乎阻止了 UI 线程:

   titleOne = new getFirstTitle().execute(creditOne).get();

最好使用一个新线程来完成长时间的工作,一旦完成,通知 UI 线程有关新数据的信息。

您可以使用 asyncTask 让您更轻松。如果您更喜欢普通线程,请使用handler(并使用handler.post)或runOnUiThread在线程完成后使用。

如果您使用 hanlder ,请不要忘记在线程本身之外创建它。

作为一个新的 android 开发者,你应该观看 google IO 视频。他们可以提供很多帮助。观看 2010 年至 2012 年的视频。

于 2012-09-17T22:19:39.023 回答
0

我认为这是正确的方法:使用 AsyncTask 是一种防止您的应用程序冻结 UI 的简单方法。

但我真的不明白以下行的作用。

idOne = new getFirstID().execute(searchURLOne).get();

事实上,我以前从未见过它。无论如何,您在 ArrayList 中管理多少条记录?10, 100, 1000, 1 000 000 ?

如果您正在处理大量记录,您的手机将需要一定的时间来完成操作,您将无法减少它。如果集合太大,唯一的解决方案是尝试直接在服务器上或在构建 ArrayList 时尝试减少它。

于 2012-09-17T21:18:38.357 回答
0

我不一定要关注 AsyncTask 的创建位置和执行位置,但将整个 getData 方法放在 AsyncTask 上似乎是个好主意。除此之外,如果它可以在设备上运行但不能在设备上运行,我的第一个怀疑是网络访问。确保您的设备不仅可以访问互联网,还可以访问运行远程查询所需的服务。很常见的误解是,手机不能像我们的台式机一样看到相同的主机。此外,如果您的手机在 Wifi 上漫游,请检查 Wifi 网络是否允许访问该服务。远程查询服务是 Web 服务吗?它是您尝试运行的 DBMS SQL 调用吗?查询是否需要特定的网络端口?

于 2012-09-17T21:58:56.030 回答