2012-11-07 99 views
0

我有一个函数应该返回arraylist对象,但由于某种原因它卡在返回语句。 return语句之前的所有内容都在工作。我有一个错误,ArrayLists只包含一个使函数可以工作的值,但当然会返回错误的数据。功能被卡住/冻结在返回声明

package com.burninglobster.TP; 

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.LinearLayout; 

public class Chart2Activity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    Object graphdata[] = graphsetup(); 
      Log.d("This message is NOT shown", ""); 

    List<Double> distances = (List<Double>) graphdata[0]; 
    List<Double> accall = (List<Double>) graphdata[1]; 
    List<Double> accdir = (List<Double>) graphdata[2]; 
    List<Double> accdist = (List<Double>) graphdata[3]; 
    List<Double> meandir = (List<Double>) graphdata[4]; 
    List<Double> meandist = (List<Double>) graphdata[5]; 
    linegraph lgraph = new linegraph(); 

    setContentView(R.layout.splot); 

    LinearLayout layout1 = (LinearLayout) findViewById(R.id.splot2); 
    layout1.addView(lgraph.getView1(this, distances, accall)); 

    LinearLayout layout2 = (LinearLayout) findViewById(R.id.splot3); 
    layout2.addView(lgraph.getView2(this, distances, accdir, meandir)); 

    LinearLayout layout3 = (LinearLayout) findViewById(R.id.splot4); 
    layout3.addView(lgraph.getView2(this, distances, accdist, meandist)); 
} 


public Object[] graphsetup() { 

    SharedPreferences rprefs; 
    rprefs = getSharedPreferences("com.burninglobster.TP.tprefs", 
      Context.MODE_WORLD_READABLE); 
    double setdist = rprefs.getFloat("setdist", 0); 

    String[] sourcesarray = rprefs.getString("sourcesarray", "Standarddef") 
      .split(","); 
    String setdisc = sourcesarray[rprefs.getInt("spindiscpos", 0)]; 
    DBHelper dbHelper = new DBHelper(Chart2Activity.this); 
    SQLiteDatabase db; 
    db = dbHelper.getReadableDatabase(); 
    String graphquery = "SELECT " + DBHelper.SHOOTER + "," + DBHelper.WDIR 
      + "," + DBHelper.WSTR + "," + DBHelper.SMOD + "," 
      + DBHelper.DIST + "," + DBHelper.R_DIST + "," 
      + DBHelper.OS_DIST + " FROM " + DBHelper.TABLE + " WHERE " 
      + DBHelper.SHOOTER + "='" + setdisc + "'" + " ORDER BY " 
      + DBHelper.DIST; 
    Cursor graphcursor = db.rawQuery(graphquery, null); 
    int rows = graphcursor.getCount(); 

    int ishooter = graphcursor.getColumnIndex(DBHelper.SHOOTER); 
    int iwdir = graphcursor.getColumnIndex(DBHelper.WDIR); 
    int iwstr = graphcursor.getColumnIndex(DBHelper.WSTR); 
    int ismod = graphcursor.getColumnIndex(DBHelper.SMOD); 
    int idist = graphcursor.getColumnIndex(DBHelper.DIST); 
    int irdist = graphcursor.getColumnIndex(DBHelper.R_DIST); 
    int iosdist = graphcursor.getColumnIndex(DBHelper.OS_DIST); 

    List<Double> accall = new ArrayList<Double>(); 
    List<Double> accdir = new ArrayList<Double>(); 
    List<Double> meandir = new ArrayList<Double>(); 
    List<Double> accdist = new ArrayList<Double>(); 
    List<Double> meandist = new ArrayList<Double>(); 
    List<Double> accdirtemp = new ArrayList<Double>(); 
    List<Double> accdisttemp = new ArrayList<Double>(); 
    List<Double> distances = new ArrayList<Double>(); 

    double dalla = 0; 
    double ddira = 0; 
    double ddista = 0; 
    double ddirm = 0; 
    double ddistm = 0; 
    double currentdist = 0; 

    graphcursor.moveToFirst(); 
    if (rows > 0) { 
     currentdist = graphcursor.getDouble(idist); 
    } 

    for (int i = 0; i < rows; i++) { 
        // REMOVED ERROR CAUSING SINGLE VALUE IN ARRAYLISTS: 
        // currentdist=graphcursor.getDouble(idist); 
     if (graphcursor.getDouble(idist) < (currentdist + 5)) { 

      accdirtemp.add(graphcursor.getDouble(irdist)); 
      accdisttemp.add(graphcursor.getDouble(iosdist)); 

     } else { 

      for (int u = 0; u < accdirtemp.size(); u++) { 

       ddira += Math.pow(accdirtemp.get(u), 2); 
       ddista += Math.pow(accdisttemp.get(u), 2); 
       dalla += Math.pow(accdirtemp.get(u), 2) 
         + Math.pow(accdisttemp.get(u), 2); 
       ddirm += accdirtemp.get(u); 
       ddistm += accdisttemp.get(u); 

      } 

      accall.add(Math.sqrt(dalla/accdirtemp.size())); 
        Double.toString(Math.sqrt(dalla/accdirtemp.size()))); 
      accdir.add(Math.sqrt(ddira/accdirtemp.size())); 
      accdist.add(Math.sqrt(ddista/accdirtemp.size())); 
      meandir.add(ddirm/accdirtemp.size()); 
      meandist.add(ddistm/accdirtemp.size()); 
      distances.add(currentdist); 
      dalla = 0; 
      ddira = 0; 
      ddirm = 0; 
      ddista = 0; 
      ddistm = 0; 

      currentdist = graphcursor.getDouble(idist) + 5; 
      accdirtemp.clear(); 
      accdisttemp.clear(); 
      accdirtemp.add(graphcursor.getDouble(irdist)); 
      accdisttemp.add(graphcursor.getDouble(iosdist)); 

     } 

     graphcursor.moveToNext(); 
    } 

    for (int u = 0; u < accdirtemp.size(); u++) { 

     ddira += Math.pow(accdirtemp.get(u), 2); 
     ddista += Math.pow(accdisttemp.get(u), 2); 
     dalla += Math.pow(accdirtemp.get(u), 2) 
       + Math.pow(accdisttemp.get(u), 2); 
     ddirm += accdirtemp.get(u); 
     ddistm += accdisttemp.get(u); 

    } 

    accall.add(Math.sqrt(dalla/accdirtemp.size())); 
    accdir.add(Math.sqrt(ddira/accdirtemp.size())); 
    accdist.add(Math.sqrt(ddista/accdirtemp.size())); 
    meandir.add(ddirm/accdirtemp.size()); 
    meandist.add(ddistm/accdirtemp.size()); 
    distances.add(currentdist); 

    db.close(); 
    dbHelper.close(); 

      Log.d("This message", " is shown"); 
    return new Object[] { distances, accall, accdir, accdist, meandir, 
      meandist }; 

} 

} 

我有一个类似的功能工作得很好,我看不出区别:

package com.burninglobster.TP; 

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.LinearLayout; 

public class ChartActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    Object plotdata[] = plotsetup(); 
      Log.d("This message", " is also shown"); 

    List<Double> rd1 = (List<Double>) plotdata[0]; 
    List<Double> osd1 = (List<Double>) plotdata[1]; 
    List<Double> rd2 = (List<Double>) plotdata[2]; 
    List<Double> osd2 = (List<Double>) plotdata[3]; 
    List<Double> rd3 = (List<Double>) plotdata[4]; 
    List<Double> osd3 = (List<Double>) plotdata[5]; 
    scatterplot plot = new scatterplot(); 
    setContentView(R.layout.tplot); 
    LinearLayout layout = (LinearLayout) findViewById(R.id.chart); 
    layout.addView(plot.getView(this, rd1, osd1, rd2, osd2, rd3, osd3)); 
} 

public Object[] plotsetup() { 

    SharedPreferences rprefs; 
    rprefs = getSharedPreferences("com.burninglobster.TP.tprefs", 
      Context.MODE_WORLD_READABLE); 

    double setdist = rprefs.getFloat("setdist", 0); 
    String[] sourcesarray = rprefs.getString("sourcesarray", "Standarddef") 
      .split(","); 
    String setdisc = sourcesarray[rprefs.getInt("spindiscpos", 0)]; 

    DBHelper dbHelper = new DBHelper(ChartActivity.this); 
    SQLiteDatabase db; 
    db = dbHelper.getReadableDatabase(); 

    String plotquery = "SELECT " + DBHelper.SHOOTER + "," + DBHelper.WDIR 
      + "," + DBHelper.WSTR + "," + DBHelper.SMOD + "," 
      + DBHelper.DIST + "," + DBHelper.R_DIST + "," 
      + DBHelper.OS_DIST + " FROM " + DBHelper.TABLE; 
    Cursor plotcursor = db.rawQuery(plotquery, null); 
    int ishooter = plotcursor.getColumnIndex(DBHelper.SHOOTER); 
    int iwdir = plotcursor.getColumnIndex(DBHelper.WDIR); 
    int iwstr = plotcursor.getColumnIndex(DBHelper.WSTR); 
    int ismod = plotcursor.getColumnIndex(DBHelper.SMOD); 
    int idist = plotcursor.getColumnIndex(DBHelper.DIST); 
    int irdist = plotcursor.getColumnIndex(DBHelper.R_DIST); 
    int iosdist = plotcursor.getColumnIndex(DBHelper.OS_DIST); 

    int rows = plotcursor.getCount(); 

    List<Double> rd1 = new ArrayList<Double>(); 
    List<Double> osd1 = new ArrayList<Double>(); 
    List<Double> rd2 = new ArrayList<Double>(); 
    List<Double> osd2 = new ArrayList<Double>(); 
    List<Double> rd3 = new ArrayList<Double>(); 
    List<Double> osd3 = new ArrayList<Double>(); 

    plotcursor.moveToFirst(); 
    int disccount = 0; 
    int array1 = 0; 
    int array2 = 0; 
    int array3 = 0; 
    double cursordist; 

    for (int i = 0; i < rows; i++) { 
     if (plotcursor.getString(0).equals(setdisc)) { 
      cursordist = plotcursor.getDouble(idist); 
      if (cursordist > (setdist - 5) && cursordist < (setdist + 5)) { 
       rd1.add(plotcursor.getDouble(irdist)); 
       osd1.add(plotcursor.getDouble(iosdist)); 
       array1++; 
      } else if (cursordist > (setdist) 
        && cursordist < (setdist + 10)) { 
       rd2.add(plotcursor.getDouble(irdist)); 
       osd2.add(plotcursor.getDouble(iosdist)); 
       array2++; 
      } else if (cursordist > (setdist - 10) 
        && cursordist < (setdist)) { 
       rd3.add(plotcursor.getDouble(irdist)); 
       osd3.add(plotcursor.getDouble(iosdist)); 
       array3++; 
      } 
      disccount++; 
     } 
     plotcursor.moveToNext(); 
    } 
    db.close(); 
    dbHelper.close(); 

      Log.d("This message", " is shown"); 
    return new Object[] { rd1, osd1, rd2, osd2, rd3, osd3 }; 
} 
} 

我只是return语句前加上一个“Log.d”,然后另一只后显示活动中的功能调用,仅显示第一个功能。它会冻结半分钟,然后显示对话等待或杀死。我不知道如何获得有关该问题的更多信息。建议?

+0

我刚刚意识到,我忘了关闭db和dbHelper,但问题仍然存在。 – NMKloster

回答

0

不知道问题是什么,你将不得不解释“卡在返回声明”。代码不会简单地“卡住”。

但是你会帮助你自己解决问题的很多。例如,如果您创建了类并处理了类的实例而不是非类型化的对象数组,那么您的代码将更容易编写,调试起来更容易,维护也更容易。这样做也将使编译器能够在需要帮助之前捕获很多错误:)

无论何时您试图使用“对象”,您应该停下来并质疑自己。当然,有时候Object是有用的,有些时候你没有选择,但是它们是特殊的,只有有充分的理由才能完成 - 并不是因为你没有花时间去想一个正确的解决方案。

您还应该为变量选择更好的名称并使用适当的Java命名约定。在这里,我已经命名了Thing对象,因为你的代码没有给出适当的线索,例如dalla,ddira,ddista等等,以及在注释或代码中是如何相互关联的(这是一件坏事 - 这个代码可能只有你才能看到,但当你一年回来时,你会希望你做了这些事情)。

例如:

class Thing{ 

    double dalla = 0; 
    double ddira = 0; 
    double ddista = 0; 
    double ddirm = 0; 
    double ddistm = 0; 
    double currentdist = 0; 

} 

然后,在你的循环,方法或者什么的,

ArrayList<Thing> things = new ArrayList<Thing>(); 

... 

Thing thing = new Thing(); 
for (int u = 0; u < accdirtemp.size(); u++) { 

    thing.ddira += Math.pow(accdirtemp.get(u), 2); 
    thing.ddista += Math.pow(accdisttemp.get(u), 2); 
    thing.dalla += Math.pow(accdirtemp.get(u), 2) 
      + Math.pow(accdisttemp.get(u), 2); 
    thing.ddirm += accdirtemp.get(u); 
    thing.ddistm += accdisttemp.get(u); 
} 

things.add(thing); 

... 

等。现在花时间重构代码,然后再阅读它的恶梦。

+0

非常好的建议。我知道这很重要,而且我的编码卫生状况实际上已经有所改善,但我希望能够消除这种“颠簸”,然后做一些清洁工作。 我在return语句之前添加了一个'Log.d',然后在活动中的函数调用之后添加了另一个'Log.d',并且只显示第一个。它会冻结半分钟,然后显示对话等待或杀死。我不知道如何获得有关该问题的更多信息。建议? – NMKloster

+0

为什么要平滑凹凸,如果你打算重构它?听起来像对我来说双重工作。它不会花费你很长时间,我保证你以后会感到更满意。未来的编码将大大加速。 – Simon

+0

好的,所以我觉得这很愚蠢,因为发布这个和浪费编码器的时间!我的问题在其他地方找到。真正的问题是,我正在使用'Log.d'错误。如果文本字符串为空,它似乎不会被发送到日志: 'Log.d(“This return”,“something”)'; Log.d(“不返回任何内容”,“”)):S [tag:Log.d] – NMKloster

0

好的,所以我感觉很蠢,因为发布这个和浪费编码器的时间!

我的问题在别处找到。真正的问题是,我使用Log.d错误。如果文本字符串为空,它似乎不会发送到日志: Log.d("This return","something"); Log.d("This returns nothing",""):S