java - 将数据从一个类的一个对象复制到 Android 中另一类的另一个对象

标签 java android android-asynctask

我在android中有一个应用程序,其中我正在从服务器访问数据,该数据是使用扩展AsyncTask的单独类LongOperation访问的。现在我在 LongOperation 类中获取数据,但我无法将此数据复制到另一个类对象中,我需要使用它来存储在 sqlitedb 中。 我尝试直接将数据写入 sqlitedb,但鉴于类 LongOperation 不是 Activity ,我无法传递上下文 super (新的MainActivity(),DATABASE_NAME,null,DATABASE_VERSION); 根据 sqlitedb 的要求。 使用类库访问获取数据的对象。 我通过单击 MainActivity 类中的按钮调用 LongOperation 类,该类也是一个 Activity ,但此处的上下文不起作用。 以下是描述调用和数据获取过程的相关摘录。

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 呢?或者是否有其他方法将数据存储在文件中,以便我可以通过其他类访问它? object中的数据为string[]格式,键值对。这里的问题是由于类 LongOperation 是一个非 Activity 类,因此在使用文件编写器或共享首选项时无法传递上下文。

编辑 1:

主要 Activity

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;
        }
}

最佳答案

虽然代码 fragment 不是使用 AsyncThread 的最佳方式,但如果我必须具体回答您的问题,那么您的变量是公共(public)静态的。为什么不使用如下所示的东西。

protected String doInBackground(String... params) {
    if (getUserData) {
        MainActivity.upd  = *data fetched from server*
    }

关于java - 将数据从一个类的一个对象复制到 Android 中另一类的另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012715/

相关文章:

java - 如何在标记下移动 map ?安卓

android - OpenCV转换每个像素的颜色

java - 无法将上下文从 onpostexecute 传递到共享首选项

java - 自定义具有多个系列、轴和形状的图表

java - 有Character.toChar吗?

java - 当我向下滚动时,侧面菜单变成白色

java - 从 Android 应用程序传递值并显示在控制台上

java - 如何在 Java 中区分 LAN 上的在线 IP 地址与本地 IP/其他机器 IP

android - 在 android 中运行线程时显示和关闭进度对话框

android - 无法使用适用于 Android 4 的代码在未调用 Looper.prepare() 的线程内创建处理程序