我在android中有一个应用程序,我从服务器访问数据,使用扩展AsyncTask的单独类LongOperation访问。现在我在LongOperation类中获取数据,但是我无法将这些数据复制到另一个类对象中,我需要将它用于存储在sqlitedb中。 我曾尝试直接将数据写入sqlitedb,但鉴于LongOperation类不是一个活动,我无法传递上下文 super(new MainActivity(),DATABASE_NAME,null,DATABASE_VERSION); 按照sqlitedb的要求。 使用类库访问获取数据的对象。 我在MainActivity类中点击按钮来调用LongOperation类,这也是一个活动,但是这里的上下文不起作用。 以下是描述调用和数据获取过程的相关摘录。
MainActivity按钮按代码(在单独的文件中)
import LibPack.UpdateData;
public static UpdateData upd;
public void onClick(View arg0) {
upd = new UpdateData();
LongOperation.getUserData = true;
lo = new LongOperation();
lo.execute("");
}
LongOperation类代码(在单独的文件中)
import LibPack.UpdateData;
public static class LongOperation extends AsyncTask<String, Void, String> {
public static UpdateData upd;
@Override
protected String doInBackground(String... params) {
if (getUserData) {
upd = *data fetched from server*
}
}
那么如何将此类中的数据返回给MainActivity?或者,如果有其他方法将数据存储在文件中,以便我可以通过其他类访问它?对象中的数据是string []格式和键值对。这里的问题是由于LongOperation类是非活动类引起的,因此在使用文件编写器或共享首选项时无法传递上下文。
修改1:
MainActivity
package com.sam.vehicle;
import com.example.vehicle.R;
import com.sam.vehicle.CommonData.LongOperation;
import LibPack.UpdateData;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity implements AsyncResponse{
Button b;
public static LongOperation lo = new LongOperation();
public static String resp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lo.delegate = this;
b = (Button) findViewById(R.id.btnProceed);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
upd = new UpdateData();
CommonData.getUserData = true;
System.out.println("Before execute");**//prints fine**
lo.execute("");
System.out.println("At main extract");**//prints with previous sysout**
System.out.println("At main extract resp = "+resp);**//prints = null**
Intent ii = new Intent(arg0.getContext(), LoginActivity.class);
ii.putExtra("number", phoneNumber.getText().toString());
startActivity(ii);
}
});
}
@Override
public void processFinish(String output) {
// TODO Auto-generated method stub
System.out.println("Executed processFinish in main. output = "+output);**//doesn't print
resp = output;
}
}
AsyncTask类:
package com.sam.vehicle;
import com.example.vehicle.R;
public class CommonData {
public static boolean getUserData = false;
public static String resp;
public static class LongOperation extends AsyncTask<String, Void, String> {
public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
System.out.println("In commondata onpostexe");**//doesn't print**
delegate.processFinish(result);
}
@Override
protected String doInBackground(String... params) {
if (getUserData) {
sendToServer = false;
try {
upd = (UpdateData) stringToObject(resp);
for (int i = 0; i < upd.pass.length; i++) {
System.out.println("upd.usn["+i+"]"+upd.usn[i]);
System.out.println("upd.pass["+i+"]"+upd.pass[i]);
}**//prints fine here**
System.out.println("in commondata resp="+resp);**//prints fine here**
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("resp from common return = "+resp);**//doesn't print**
return resp;
}
}
答案 0 :(得分:1)
虽然代码片段不是使用AsyncThread的最佳方式,但如果我必须回答您的问题,那么您的变量是公共静态的。你为什么不用下面的东西。
protected String doInBackground(String... params) {
if (getUserData) {
MainActivity.upd = *data fetched from server*
}
答案 1 :(得分:0)
This是你想见的事情的最佳方法。