2012-09-17 62 views
0

我是一般的android开发和软件编程的新手,并且相信我的应用程序中存在线程问题。该应用程序所做的是根据对api的两个查询搜索两组结果,并将每组结果存储在其自己的列表中。生成的新列表仅包含两个列表中的元素。该应用在桌面上的虚拟设备中运行,但挂在我的Galaxy Nexus上。我正在使用arraylist,但我想知道是否hashset在完成这种类型的操作时会更快。以下是我的主要活动。 getfirst和secondID在asynctask以及getfirst和secondtitle中完成,以防止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; 
} 
} 

回答

0

我认为这是正确的方法:使用AsyncTask是一种简单的方法来阻止您的应用程序冻结用户界面。

但我真的不明白下面这行是做什么的。

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

其实我从来没有见过它。无论如何,你在ArrayList中管理多少条记录? 10,100,1000,1 000 000?

如果您正在处理大量记录,您的手机将需要一定的时间才能完成操作,并且无法将其缩小。唯一的解决方案,如果集合太大,试图减少它可能直接在你的服务器或当你建立你的ArrayList。

0

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

+0

在getData中,存在对getFirstID和getSecondID以及getSecondTitle和getSecondTitle的调用。这些clases实现asynctask并查询api。我想尝试必须getData扩展asynctask,但无法想出一个方法来传递两个参数,因为asynctask在String中进行...在我的研究中并通过玩弄它我的印象是asynctask只会在stringbuilder可变长度。如果有一种方法,我可以传递两个参数即。 searchURLOne和searchURLTwo或者一个字符串数组,即[[searchURLOne] [searchURLTwo]],这是值得尝试的。 – user881667

+0

让我们先弄清楚如何让它工作,然后弄清楚如何优化它。当你说它挂在设备上时,这是否意味着它只需要很长时间,或者是否意味着它会无限期地挂起?如果它永远挂起,请检查手机和桌面之间的网络差异。 – Cliff

+0

asyncTask可以使用您选择的指定类型的任意数量的参数。你当然可以扩展它并传递任何你想要的东西。 –

0

这一次似乎阻塞UI线程:

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

更好地使用一个新的线程做长期的工作,一旦完成,通知有关新数据的UI线程。

您可以使用asyncTask使其更容易。如果您更喜欢普通线程,则在线程完成后使用handler(并使用handler.post)或使用runOnUiThread

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

作为一名新的android开发者,您应该观看google IO视频。他们可以帮助很多。从2010年到2012年观看视频。

相关问题