[英]Copy data from one object from one class to another boject in another class in Android
我在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類是非活動類引起的,因此在使用文件編寫器或sharedpreferences時無法傳遞上下文。
編輯1:
主要活動
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;
}
}
盡管代碼片段不是使用AsyncThread的最佳方式,但是如果我必須針對您的問題進行回答,那么您的變量就是public static。 您為什么不使用類似以下的內容。
protected String doInBackground(String... params) {
if (getUserData) {
MainActivity.upd = *data fetched from server*
}
這是我見過的最想完成的事情的最佳方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.