2014-01-21 41 views
1

我試圖將單個「字符串」傳遞給AsyncTask。我整天都在尋找,但仍然無法得到它。我在ArrayList有一些數據,我得到一個數據(字符串)到AsyncTask,它不工作。但是當我用引號傳遞字符串時,它的作品。這是我的第一個例子代碼ArrayListAndroid AsyncTask:從ArayList傳遞單個「字符串」來執行

ArrayList<String> example= new ArrayList<String>();//we consider it have data 
new Mytask().execute(example.get(0).toString()); 

這裏是我的第二個碼單引號字符串:

String example="exm"; 
new Mytask().execute(example); 

,這是我的AsyncTask代碼:

@Override 
protected String doInBackground(String... params) { 
    String str = params[0]; 

    return str; 
} 

我用的AsyncTask代碼兩種方法:ArrayList和單個字符串。但它只是從字符串引號的作品,我一直在嘗試這樣的一種方法,但仍然沒有工作:

ArrayList<String> example= new ArrayList<String>(); 
String exmpl=example.get(0).toString(); 
new Mytask().execute(exmpl); 

請幫幫我,哪裏是我的錯,我怎麼能解決這個問題。感謝

UPDATE:這是我的完整代碼:

public class MasterTokoActivity extends Activity{ 

TextView new_namaToko,new_alamat; 
Spinner new_provinsi,new_kota,new_kecamatan; 
mydatabase db; 
ProgressBar load_prov,load_kota,load_kec; 

ArrayList<String> propinsi = new ArrayList<String>(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mastertoko); 

    new_namaToko = (TextView) findViewById(R.id.new_namaToko); 
    new_alamat = (TextView) findViewById(R.id.new_alamat); 
    new_provinsi = (Spinner) findViewById(R.id.new_provinsi); 
    new_kota = (Spinner) findViewById(R.id.new_kota); 
    load_prov = (ProgressBar) findViewById(R.id.load_prov); 
    load_kota = (ProgressBar) findViewById(R.id.load_kota); 

    new MyasyncTask().execute(); 
    new_provinsi.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){ 

      new MyasyncTaskkota().execute(propinsi.get(pos)); 
    } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

} 

public class MyasyncTask extends AsyncTask<String, Integer, Integer>{ 

    @Override 
    public void onPreExecute() {  
     load_prov.setVisibility(View.VISIBLE); 
     new_provinsi.setClickable(false); 
     new_provinsi.setEnabled(false); 
     } 

    @Override 
    protected Integer doInBackground(String... arg0) { 
    // TODO Auto-generated method stub 
     int result=-1; 

      db = new mydatabase(getApplicationContext()); 
      propinsi=db.ambilProvinsi();    
    if(propinsi.size()!=0) 
    { 
     result=1; 
    } 
    return result; 
    } 

    @Override 
    protected void onPostExecute(Integer result){ 
     super.onPostExecute(result); 
     if(result==1){ 

      ArrayAdapter<String> adapterProv = new ArrayAdapter<String>(MasterTokoActivity.this,android.R.layout.simple_spinner_item, propinsi); 
      adapterProv.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      new_provinsi.setAdapter(adapterProv); 

     } 
     load_prov.setVisibility(View.INVISIBLE); 
     new_provinsi.setClickable(true); 
     new_provinsi.setEnabled(true); 


    } 
    } 

public class MyasyncTaskkota extends AsyncTask<String, Integer, Integer>{ 
    ArrayList<String> kota = new ArrayList<String>(); 
    @Override 
    public void onPreExecute() {  
     load_kota.setVisibility(View.VISIBLE); 
     new_kota.setClickable(false); 
     new_kota.setEnabled(false); 
     } 

    @Override 
    protected Integer doInBackground(String... prov) { 
    // TODO Auto-generated method stub 
     int result=-1; 
      db = new mydatabase(getApplicationContext()); 
      kota=db.ambilKota(prov[0]); 
    if(kota.size()!=0) 
    { 
     result=1; 
    } 
    return result; 
    } 

    @Override 
    protected void onPostExecute(Integer result){ 
     super.onPostExecute(result); 
     if(result==1){ 

      ArrayAdapter<String> adapterKota = new ArrayAdapter<String>(MasterTokoActivity.this,android.R.layout.simple_spinner_item, kota); 
      adapterKota.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      new_kota.setAdapter(adapterKota); 
      adapterKota.notifyDataSetChanged(); 
     } 
     load_kota.setVisibility(View.INVISIBLE); 
     new_kota.setClickable(true); 
     new_kota.setEnabled(true); 
    } 
    } 
} 

這是ambilProvinsi()方法在我的數據庫幫手:

public ArrayList<String> ambilProvinsi(){ 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor cur; 

    ArrayList<String> sv=new ArrayList<String>(); 

    cur = db.query("propinsi", new String []{"nama_propinsi"}, null, null, null, null, null); 
    cur.moveToFirst(); 
    if (!cur.isAfterLast()){ 
     do{     
      sv.add(cur.getString(0)); 
     }while (cur.moveToNext()); 
    } 

return sv; 
} 

並且在logcat中沒有錯誤。

+0

使用example.get(0).toString()是不必要的,只需使用example.get(0)。它已經是ArrayList (),所以使用toString()是多餘的。 – Submersed

+1

這是什麼意思,「//我們認爲它有數據」?在你調用get(0)之前是否有數據? – codeMagic

+0

我也已經使用'example.get(0)'。但它也不起作用 – Nizarhdt

回答

0

謝謝回答人,我所有的代碼工作現在,沒有什麼需要改變。 問題來自我的數據編碼。一旦我將數據編碼更改爲utf8,我的應用程序正常運行。 Charset for Android可以發現here

0

正如我在我的評論中提到的,使用toString()是多餘的,所以你應該把它說出來。另外,你確定你沒有傳遞空/空數據?你肯定不會檢查你的輸入...首先,你應該改變:

@Override 
protected String doInBackground(String... params) { 
    String str = params[0]; 

    if(str == null)  
     throw new NullPointerException("Provided null string to: " + getClass().getSimpleName()); 

    return str; 
} 
+0

之前我alreday之前我檢查將它傳遞給asynctask。我打印使用吐司我打電話之前'新Mytask()執行(example.get(0)的ToString());'。它告訴我沒有空 – Nizarhdt

+0

後更原始源的,因爲從上面的代碼 - 很明顯,你正在呼籲得到一個空的ArrayList。如果這不是你做你的實際代碼是什麼,我們如何想幫助發現問題? – Submersed

0

這很奇怪。但你可以嘗試在構造函數中傳遞你的字符串,我認爲它必須工作。

private class MyTask extends AsyncTask<Void, Void, String> { 

    private final String str; 

    public MyTask(final String str) { 
     this.str = str; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     //process this.str and return result 
    } 

    //post execute 
} 

,並呼籲

new MyTask(someString).execute(); 

而且你已經忘記關閉遊標在ambilProvinsi()方法。

相關問題