Android AsyncTask:从ArayList传递单个“字符串”来执行
问题描述:
我试图将单个“字符串”传递给AsyncTask
。我整天都在寻找,但仍然无法得到它。我在ArrayList
有一些数据,我得到一个数据(字符串)到AsyncTask
,它不工作。但是当我用引号传递字符串时,它的作品。这是我的第一个例子代码ArrayList
:Android 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中没有错误。
答
正如我在我的评论中提到的,使用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;
}
答
这很奇怪。但你可以尝试在构造函数中传递你的字符串,我认为它必须工作。
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()
方法。
使用example.get(0).toString()是不必要的,只需使用example.get(0)。它已经是ArrayList(),所以使用toString()是多余的。 –
Submersed
这是什么意思,“//我们认为它有数据”?在你调用get(0)之前是否有数据? – codeMagic
我也已经使用'example.get(0)'。但它也不起作用 – Nizarhdt