2016-08-25 6 views
1

私はVk Sdkを使用しています。バックグラウンドでサーバーからデータをロードするAsyncTaskを作成しました。しかし、その内部のタスクが完了する前にdoInBackground()が終了していることがわかります。以下のコードは次のとおりです。AsyncTaskは、内部のメソッドが終了する前にdoInBackground()を終了しています。

@Override 
protected Void doInBackground(Void... params) { 
    Log.v(TAG, "Before Loading in Background"); 

    VKRequest request = VKApi.wall().get(VKParameters.from(VKApiConst.OWNER_ID, "-100177655", VKApiConst.OFFSET, "2")); 
    request.executeWithListener(new VKRequest.VKRequestListener() { 
     @Override 
     public void onComplete(VKResponse response) { 
      super.onComplete(response); 

      String jsonData = response.responseString; 
      Log.v(TAG, "json is ready"); 
      try { 
       Log.v(TAG, "before parsing"); 
       parsePostsData(jsonData); 
       Log.v(TAG, "after parsing"); 
      } catch (JSONException e) { 
       Log.v(TAG, "EXCEPTION is thrown"); 
       e.printStackTrace(); 
      } 
     } 
    }); 

    Log.v(TAG, "Finished Background Tasks"); 
    return null; 
} 

私はrequest.executeWithListener(...)は別のスレッドを作成し、そこに必要な仕事をしていると思われます。したがって、AsyncTaskはスレッド内の作業が終了したと考えます。しかし、私は確信していません。このメソッドについては、ドキュメントには何もありません。

もう一つの問題は、それが呼び出されたときにonComplete(...)メソッドが実行されているスレッド上にありますか?メインまたは同じ個別のスレッドでrequestによって作成されますか?

すべてのヘルプは高く評価され:)

+1

あなたは正しいです。コールバック/リスナーが原因です。要求が非同期 –

+0

いる場合は、私はそれがokHttpの 'Call'は、非同期コールバックを実行 –

+0

@ElvisChweyaに似て動作することを前提とし' AsyncTask'を必要としない、あなたは 'onCompleteの(...)'メソッドについてどう思いますか?メインスレッドで実行されていますか?それを確認する方法は?ここhttps://github.com/VKCOM/vk-android-sdk/blob/master/vksdk_library/src/main/java/com/vk/sdk/api/VKRequest.javaソースコードから – Marat

答えて

1

ベース、あなたはと呼ばれる2つの異なるスレッドを持っています。 AsynTaskは、最初に実行されるバックグラウンドスレッドです。次に、VKRequest executeWithListenerを呼び出し、別のスレッドをdoInBackground()に作成しました。シングルスレッドでこれをアーカイブに

、あなたのVKRequest

@Override 
protected Void doInBackground(Void... params) { 
    Log.v(TAG, "Before Loading in Background"); 

    VKRequest request = VKApi.wall().get(VKParameters.from(VKApiConst.OWNER_ID, "-100177655", VKApiConst.OFFSET, "2")); 
    request.executeSyncWithListener(new VKRequest.VKRequestListener() { 
     @Override 
     public void onComplete(VKResponse response) { 
      super.onComplete(response); 

      String jsonData = response.responseString; 
      Log.v(TAG, "json is ready"); 
      try { 
       Log.v(TAG, "before parsing"); 
       parsePostsData(jsonData); 
       Log.v(TAG, "after parsing"); 
      } catch (JSONException e) { 
       Log.v(TAG, "EXCEPTION is thrown"); 
       e.printStackTrace(); 
      } 
     } 
    }); 

    Log.v(TAG, "Finished Background Tasks"); 
    return null; 
} 

executeSyncWithListener()にメソッドを実行するを変更する必要があり、これが役立つことを願っています!

0

はこのような何かを:

myCustomRunnable
@Override 
protected Void doInBackground(Void... params) { 
    Log.v(TAG, "Before Loading in Background"); 

    VKRequest request = VKApi.wall().get(VKParameters.from(VKApiConst.OWNER_ID, "-100177655", VKApiConst.OFFSET, "2")); 
    request.executeWithListener(new VKRequest.VKRequestListener() { 
     @Override 
     public void onComplete(VKResponse response) { 
      super.onComplete(response); 

      String jsonData = response.responseString; 
      Log.v(TAG, "json is ready"); 

// YOUR CUSTOM CALLBACK 
new Thread(new myCustomRunnable(jsonData)).start(); 
      try { 
       Log.v(TAG, "before parsing"); 
       parsePostsData(jsonData); 
       Log.v(TAG, "after parsing"); 
      } catch (JSONException e) { 
       Log.v(TAG, "EXCEPTION is thrown"); 
       e.printStackTrace(); 
      } 
     } 
    }); 

    Log.v(TAG, "Finished Background Tasks"); 
    return null; 
} 

は 'Runnableを' インターフェイスを実装するクラスです。

public class myCustomRunnable implements Runnable{ 
    private String msg =""; 
    public OToast(String msg) { 
     this.msg = msg; 
    } 
    @Override 
    public void run() { 
//here do anything you want 
Log.v("mylog",msg); 
//or even execute code in main thread: 
runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //your code 
       } 
      }); 
    } 

} 

、あるいは単純:あなたのコードの

@Override 
    protected Void doInBackground(Void... params) { 
     Log.v(TAG, "Before Loading in Background"); 

     VKRequest request = VKApi.wall().get(VKParameters.from(VKApiConst.OWNER_ID, "-100177655", VKApiConst.OFFSET, "2")); 
     request.executeWithListener(new VKRequest.VKRequestListener() { 
      @Override 
      public void onComplete(VKResponse response) { 
       super.onComplete(response); 

       String jsonData = response.responseString; 
       Log.v(TAG, "json is ready"); 

    // EXECUTE CODE IN MAIN UI THREAD: 
final String final_json = jsonData; 
runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         //your code 
textview.setText(final_json); 
        } 
       }); 

       try { 
        Log.v(TAG, "before parsing"); 
        parsePostsData(jsonData); 
        Log.v(TAG, "after parsing"); 
       } catch (JSONException e) { 
        Log.v(TAG, "EXCEPTION is thrown"); 
        e.printStackTrace(); 
       } 
      } 
     }); 

     Log.v(TAG, "Finished Background Tasks"); 
     return null; 
    } 
+0

申し訳ありませんが、私はあなたの解決策をよく理解していませんでした。私はメインスレッドの質問に記載されているメソッドを実行したくありません。あなたが見ることができるように、私はvkのいくつかのグループからの投稿をダウンロードして準備しようとしています。このプロセスがバックグラウンドで行われているときは、progressBarだけを表示したいと思います。コードを明確にしてください。 – Marat

+0

コメントされた行「// YOUR CUSTOM CALLBACK」は、「準備完了」ステータスのポイントです。 – Vyacheslav

関連する問題