2016-06-24 6 views
0

私は、AsyncTaskを拡張する別のクラスのLongOperationを使ってアクセスするサーバーからデータにアクセスしているアンドロイドのアプリケーションを持っています。今私はLongOperationクラスのデータを取得しますが、私はsqlitedbに格納するために使用する必要がある別のクラスオブジェクトでこのデータをコピーすることはできません。 私はsqlitedbに直接データを書き込もうとしましたが、LongOperationクラスがアクティビティではないため、コンテキストを渡すことができません。(新しいMainActivity()、DATABASE_NAME、null、 sqlitedbの必要に応じて 。 データをフェッチするオブジェクトには、クラスライブラリを使用してアクセスします。 Activityである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?または、他のクラスを介してアクセスできるように、ファイルにデータを格納する別の方法がある場合は、オブジェクト内のデータは、文字列[]形式とキー値のペアです。ここでの問題は、LongOperationクラスが非アクティビティクラスであるために発生します。したがって、ファイルライターまたはsharedpreferencesを使用しているときにコンテキストを渡す方法はありません。

編集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

AsyncTaskのドキュメントを読む必要があります。これはそこにカバーされています。 – Jeroen

答えて

0

This私が今までに見たことのあるものを達成するための最良の方法です。

+0

ありがとう!それは私が必要としていたものですが、それでも正しく動作するようには見えません。投稿を** Edit1 **で更新しました。これはMyコードに加えた変更で構成されています。 MainActivityのprocessFinishメソッドは、sysoutが印刷されないので、まったく到達していないようです。あなたはそれで私を助けてくれますか? – Mirhawk

+0

特定のリンクからの回答の更新の前に、最初の手順を実行してください。あなたの編集から私はあなたが第2の方法を使用しているのを見ることができます。ステップバイステップで最初のバージョンに従ってください。 –

+0

さて、私は最初の手順に従ってみましたが、簡単に思えました。それはまだ働いていないようです。私はsysoutを複数の場所に配置してコードの到達範囲を確認していますが、そのうちいくつかはコメントの後ろに表示されているとおりに印刷しません。また、MainActivity内のすべてのsystoutが最初に印刷され、次にAsyncクラスのsystoutが印刷されます。 – Mirhawk

1

私が持っている場合は、コードスニペットは、AsyncThreadを使用しての最適な方法ではありませんが、 yに固有の答え私たちの質問はあなたの変数は静的です。なぜあなたは次のようなものを使わないのですか?

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

が動作しない、私が取得: **「致命的な例外:メイン プロセス:com.example.vehicle、PID:19515 のjava.lang.NullPointerException:com.samでNULL配列 \tから読み取ろうとします。 MainActivity $ 1.onClick(MainActivity.java:70) "** 私はオブジェクトからデータを印刷します。これは、データがMainActivityから印刷された後にデータが取り出されるので、これが非同期タスクによるものだと思います。 – Mirhawk

関連する問題