2012-11-07 18 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