簡體   English   中英

將數據從一個對象從一個類復制到Android中另一個類的另一個項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM