2016-06-24 2 views
0

AsyncTask를 확장하는 별도의 클래스 LongOperation을 사용하여 액세스하는 서버의 데이터에 액세스하는 안드로이드 응용 프로그램이 있습니다. 이제 LongOperation 클래스에서 데이터를 가져 오지만이 데이터를 다른 클래스 개체에 복사 할 수 없으므로 sqlitedb에 저장해야합니다. sqlitedb에 직접 데이터를 쓰려고 시도했지만 LongOperation 클래스가 활동이 아니므로 super (새 MainActivity(), DATABASE_NAME, null, DATABASE_VERSION)에 컨텍스트를 전달할 수 없습니다.필요에 따라 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? 아니면 다른 클래스를 통해 액세스 할 수 있도록 파일에 데이터를 저장하는 다른 방법이 있습니까? 객체의 데이터는 string [] 형식과 키 값 쌍입니다. 이 문제는 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 **로 업데이트했습니다.이 코드는 내 코드에서 변경 한 내용으로 구성되어 있습니다. MainActivity의 processFinish 메소드에는 sysout이 인쇄되지 않으므로 전혀 도달하지 않은 것으로 보입니다. 그걸 도와 주실 수 있습니까? – Mirhawk

+0

주어진 링크의 응답 부분을 업데이트하기 전에 첫 번째 단계를 수행하십시오. 편집에서 두 번째 방법을 사용하고 있음을 알 수 있습니다. 첫 번째 버전을 단계별로 따라하십시오. –

+0

좋아, 나는 첫 번째 단계를 따라했는데, 그들은 쉽게 보였다. 부 그것은 여전히 ​​작동하지 않는 것 같습니다. 나는 코드 도달 범위를보기 위해 여러 위치에 sysout을 두었지만, 그 중 일부는 뒤에 나오는 주석에 표시된대로 인쇄하지 않습니다. 또한 MainActivity에있는 모든 systout이 먼저 인쇄 된 다음 systout이 Async 클래스로 인쇄됩니다. – Mirhawk

1

내가 가지고있는 경우 코드가 AsyncThread를 사용하는 최적의 방법은 아니지만 y 특정 답변 우리의 질문은 변수가 public static입니다. 왜 다음과 같은 것을 사용하지 않는가?

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

내가 얻을 작동하지 않습니다 주요 프로세스 : com.example.vehicle, PID를 : 19,515 java.lang.NullPointerException이 : com.sam에 널 (null) 배열 \t에서 읽을 수있는 시도. MainActivity $ 1.onClick (MainActivity.java:70) "** 줄에서 70 개체에서 데이터를 인쇄합니다. 나는 이것이 데이터가 MainActivity에서 인쇄 된 후에 가져 오는 비동기 작업 때문이라고 생각한다. – Mirhawk

관련 문제