繁体   English   中英

如何使我的应用无法挂在设备上

[英]How do I get my app to not hang on device

我通常是android开发和软件编程的新手,并且相信我的应用程序中存在线程问题。 该应用程序的作用是基于对api的两次查询来搜索两组结果,并将每组结果存储在其自己的列表中。 生成一个仅包含两个列表中的元素的新列表。 该应用程序在桌面上的虚拟设备中运行,但挂在我的Galaxy Nexus上。 我为此使用arraylist,但我想知道散列集是否可以更快地完成这种类型的操作。 以下是我的主要活动。 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;
}
}

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

但是我不太明白下面这行的内容。

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

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

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

我不一定要跟随AsyncTask的创建位置并付诸实践,但是将整个getData方法放在AsyncTask上似乎是一个好主意。 顺便说一句,如果它能在而不是在设备上运行,我的第一怀疑是网络访问。 确保您的设备不仅可以访问互联网,还可以访问运行远程查询所需的服务。 经常会误解电话无法看到与台式机相同的主机。 另外,如果您的手机正在Wifi上漫游,请检查Wifi网络是否可以访问该服务。 远程查询服务是Web服务吗? 您要运行的是DBMS SQL调用吗? 查询是否需要特定的网络端口?

这个似乎阻塞了UI线程:

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

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

您可以使用asyncTask使您更轻松。 如果你喜欢正常的线程,要么使用一个handler (并使用handler.post ),或使用runOnUiThread一旦线程完成。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM