2014-01-21 42 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()方法。

相关问题