2016-06-24 13 views
0

Ich habe eine Anwendung in Android, in der ich Daten zugreifen von Server, der mit einer separaten Klasse LongOperation zugegriffen wird, die AsyncTask erweitert. Jetzt bekomme ich die Daten in der LongOperation-Klasse, aber ich bin nicht in der Lage, diese Daten in ein anderes Klassenobjekt zu kopieren, wo ich es in einem sqlitedb speichern muss. Ich habe versucht, die Daten direkt in sqlitedb zu schreiben, aber da die Klasse LongOperation keine Aktivität ist, kann ich keinen Kontext in übergeben super (new MainActivity(), DATABASE_NAME, null, DATABASE_VERSION); wie von sqlitedb erforderlich. Auf das Objekt, in dem Daten abgerufen werden, wird über eine Klassenbibliothek zugegriffen. Ich rufe die LongOperation-Klasse von Button klicken in meiner MainActivity-Klasse, die auch eine Aktivität ist, aber der Kontext von hier funktioniert nicht. Im Folgenden finden Sie die zugehörigen Auszüge, die die Aufruf- und Datenabrufprozedur darstellen.Kopieren von Daten von einem Objekt aus einer Klasse in ein anderes Objekt in einer anderen Klasse in Android

MainActivity Taste Code (in separater Datei)

import LibPack.UpdateData; 
public static UpdateData upd; 

public void onClick(View arg0) { 
      upd = new UpdateData(); 
      LongOperation.getUserData = true; 
      lo = new LongOperation(); 
      lo.execute(""); 
     } 

LongOperation Klassencode (in separater Datei)

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

So wie ich wieder Daten aus dieser Klasse zurück zu die MainActivity? Oder wenn es eine andere Möglichkeit gibt, die Daten in einer Datei zu speichern, sodass ich über eine andere Klasse darauf zugreifen kann? Die Daten im Objekt haben das Format string [] und das Schlüsselwertpaar. Das Problem wird hier verursacht, weil die Klasse LongOperation eine Nicht-Aktivitätsklasse ist. Daher gibt es keine Möglichkeit, bei der Verwendung von Dateischreibern oder geteilten Voreinstellungen Kontext zu übergeben.

Edit 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 Klasse:

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

Sie sollten die AsyncTask-Dokumentation lesen. Dies ist dort abgedeckt. – Jeroen

Antwort

0

This ist die beste Methode für die Sache, die Sie erreichen wollen, die ich je gesehen habe.

+0

Danke! Das habe ich gebraucht, aber es scheint nicht richtig zu funktionieren. Ich habe den Post mit ** Edit1 ** aktualisiert, er besteht aus den Änderungen, die ich an My code vorgenommen habe. Es scheint, dass die Methode processFinish in MainActivity überhaupt nicht erreicht wird, da die Sysouts in ihnen nicht gedruckt werden. Kannst du mir bitte dabei helfen? – Mirhawk

+0

Versuchen Sie, die ersten Schritte vor dem Update-Teil der Antwort von dem angegebenen Link zu folgen. Von Ihrer Bearbeitung kann ich sehen, dass Sie den zweiten Weg verwenden. Folgen Sie einfach der ersten Version Schritt für Schritt. –

+0

Okay, ich habe versucht, die ersten Schritte zu folgen, sie schienen einfach zu sein. Es scheint immer noch nicht zu funktionieren. Ich habe Sysouts an mehreren Stellen platziert, um Code-Reichweite zu sehen, aber einige von ihnen drucken nicht wie in den Kommentaren nach ihnen angegeben. Außerdem werden zuerst alle Systemausgaben in MainActivity und dann die Systouts in Async-Klasse gedruckt. – Mirhawk

1

Obwohl der Code-Schnipsel mit AsyncThread nicht optimal ist, wenn ich spezifisch auf y antworten unsere Frage ist dann Ihre Variable statisch. Warum benutzt du nicht so etwas wie das Folgen?

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

nicht funktioniert, erhalte ich: ** "FATAL AUSNAHME: Haupt Prozess: com.example.vehicle, PID: 19515 java.lang.NullPointerException: Der Versuch von null Array \t bei com.sam zu lesen. MainActivity $ 1.onClick (MainActivity.java:70) "** In Zeile 70 drucke ich die Daten aus dem Objekt. Ich denke, dies liegt an der asynchronen Aufgabe, da Daten abgerufen werden, nachdem die Daten von MainActivity gedruckt wurden. – Mirhawk

Verwandte Themen