我在Java(& android)中几乎是新手,因此尽管进行了广泛的搜索,但我无法用有限的知识解决它。
在下面的代码中,我想通过AsyncTask从weblink获取JASONArray。之后我想从数组数据中填充我的数据库。
为此,我创建了RemoteConnectivity类,我可以使用JASONArray中的所有数据填充ArrayList importdata。但问题是,我无法从RemoteConnectivity类中访问我的数据库类mylibmandbhandler(我猜因为它没有扩展到Activity)。在ImportExport类中,如果我在调用RemoteConnectivity()。execute()[在下面的代码中]之后编写插入数据库的代码,它会在执行结束前开始插入(很明显,因为它是AsyncTask的属性)。
现在,有人可以指导我完成这个吗?或者任何链接请了解整个过程(我在至少50页中读到了它:()。
P.S。 mylibmandbhandler是我在我的包src文件夹中为我的数据库操作创建的(不是活动)的类。
public class ImportExport extends Activity {
public void webimport(View v){
new RemoteConnectivity().execute(); // START OF ASYNCTASK
//INSERT importdata INTO DATABASE AFTER EXECUTE
mylibmandbhandler db = new mylibmandbhandler(this);
for (String[] s : importdata){
db.addRecord(new mylibman(s));
}
}
final ArrayList<String[]> importdata = new ArrayList<String[]>();
private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0) {
..................
..................
importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA
return null;
}
@Override
protected void onPostExecute(Void result1)
{
// WHAT TO WRITE HERE
}
}
}
答案 0 :(得分:1)
您应该在onPostExecute
中插入数据,如下所示:
public class ImportExport extends Activity {
public void webimport(View v){
new RemoteConnectivity().execute(); // START OF ASYNCTASK
}
final ArrayList<String[]> importdata = new ArrayList<String[]>();
private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0) {
..................
..................
importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA
return null;
}
@Override
protected void onPostExecute(Void result1)
{
//INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
for (String[] s : importdata){
db.addRecord(new mylibman(s));
}
}
}
}
原因是,onPostExecute是在doInBackground
方法下载数据后执行的方法(回调)。
或者:如果您希望后台线程完成插入,您还可以将insert
语句放在doInBackground
中。如果插入数据库非常耗时,这可能会有所帮助。在这种情况下,UI线程不会阻止。 “
public class ImportExport extends Activity {
public void webimport(View v){
new RemoteConnectivity().execute(); // START OF ASYNCTASK
}
final ArrayList<String[]> importdata = new ArrayList<String[]>();
private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0) {
..................
..................
importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA
//INSERT importdata INTO DATABASE. NOW DONE IN THE BACKGROUND THREAD (Alternate method)
mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
for (String[] s : importdata){
db.addRecord(new mylibman(s));
}
return null;
}
@Override
protected void onPostExecute(Void result1)
{
}
}
}
更新:在我的回答中要强调的重要一点是,我使用了new mylibmandbhandler(ImportExport.this);
代替new mylibmandbhandler(this);
而this
指的是AsyncTask
不是构造函数支持的。
答案 1 :(得分:1)
您需要使用onPostExecute方法将数据插入数据表。像这样:
private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0) {
..................
..................
importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA
return null;
}
@Override
protected void onPostExecute(Void result1)
{
//INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
for (String[] s : importdata){
db.addRecord(new mylibman(s));
}
}
}