2012-04-04 2 views
1
new Thread(new Runnable() { 
     public void run() { 
      String response = null; 
      //String res = null; 
      try { 
       response = CustomHttpClient.executeHttpPost("http://abc.org/fypcps/furqan.php"); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       //Toast.makeText(context, e.toString(), 0).show(); 
       //Log.i("furqan", "ya ALLAH madad"); 
      } //Enetr Your remote PHP,ASP, Servlet file link 
      String res = response.toString(); 
      // res = res.trim(); 
      //res= res.replaceAll("\\s+",""); 
      //error.setText(res); 
      //if(res.equals("1")) 
       //Log.i("furqan1", res); 
      //else 
       //Log.i("furqan2", "no string is captured"); 
      response1 = res; 
     } 
     }).start(); 

여기 내 코드에서 response1은 내가 스레드 위에 선언 한 문자열이고 "res1"에 문자열을 할당하려고하지만 그것은 enclosed 유형의 error.can을 제공합니다. 몸이 나를이 문제로 도와주세요.스레딩에서 변수 사용

+0

'final' 변수 만 익명 내부 클래스에서 액세스 할 수 있습니다. 당신이 그것을 할당하려하기 때문에 여기에 문제가 생길 것입니다. 그러나 나머지 코드를 표시하지 않고, 관련없는 주석 처리 된 것들을 포함하기 때문에 추측하고 있습니다. –

+0

관련 코드를 붙여 넣습니다. 'response1'은'final' 변수가 아니기 때문에 접근 할 수 없습니다. 최종 변수라면 재 할당 할 수 없습니다. 또한 제목과 관련성을 높이십시오 (예 : 정확한 오류 메시지). –

+0

좋아,이 질문을 개선하지 않았기 때문에 -1. SO에서 발견 할 수없는 더러운 쓰레기. –

답변

0

Java는이 시나리오에서 사용되는 경우 (원하지 않는 부작용을 방지하기 위해) 변수가 final이어야하므로 익명 클래스 내부에서 변수에 할당 할 수 없습니다.

당신은 당신의 변수에 대한 래퍼를 만들어이 문제를 해결하기 위해 시도 할 수

:

class StringWrapper { 
    public String innerString; 
} 

final StringWrapper wrapper = new StringWrapper(); 

new Thread(new Runnable() { 
    public void run() { 
     ... 
     wrapper.innerString = res; 
    } 
}); 
+0

부작용이있는 메서드를 호출 할 수 있다고 생각하지만 그렇지 않습니까? (예 :'setResponse1 (String str)'메소드) – jpm

+0

@jpm : 가능합니다. 대체 솔루션 일 수 있습니다. – Tudor

+0

innerString을 static으로 만드는 것은 버터 솔루션이 아닙니다. 값을 할당 할 때마다 StringWrapper의 인스턴스화를 피할 수 있기 때문입니다. –

0

난 당신이 스레드 내에서 인스턴스 변수의 값을 보낼 수 있다고 생각합니다.

package pro.Project; 

import android.app.Activity; 
import android.os.Bundle; 

public class ProjectActivity extends Activity { 
    /** Called when the activity is first created. */ 
    private String foo = ""; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     String bar = ""; // Non-final local variable 

     Thread t = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       foo ="bar"; // This would work 
       bar ="baz"; // This WOULDN'T. As 'bar' is a non-final local variable 
      } 
     }); 
     t.start(); 
    } 
} 
+0

이것이 문제의 해결책이지만, 전역 변수를 추가하는 것은 좋은 생각이라고 생각하지 않습니다. 실제로 메소드가 다른 메소드가 보지 말아야 할 상태를 사용하게 만듭니다. – Tudor

+0

그것이 작동하는지 확인 하시겠습니까? 왜냐하면 나는 foo를 최종 변수로 보지 않기 때문입니다! –

+0

필자는 그것을 컴파일하고 Android 에뮬레이터에서 실행하려고 시도했지만 제대로 작동했습니다. 그 줄에 중단 점을 놓고 값이 제대로 설정되어 있는지 확인하십시오. @ 튜더 나는 타이핑 할 때 국제 대회에 관해 많이 생각하지 않았다. 그러나 클래스의 모든 인스턴스 메소드가 private 인스턴스 변수에 액세스하지 않아야합니까? 물론 위에서 제시 한 jpm이 해결책이기도합니다. –

4

같은 뭔가 또 다른 방법은 최종 배열로 스레드의 당신의 문자열 변수 외부를 선언하는 것입니다, 그래서 당신은 당신이 스레드 내에서 원하는 값을 할당 할 수 있습니다.

final String [] answer = new String[1];  
    answer[0]="init value"; 
    System.out.println(answer[0]); // return "init value" 
    new Thread(new Runnable() { 
     public void run() { 

      answer[0]="value assigned from the thread"; 
     } 
    }).start(); 

    try { 
    Thread.currentThread().sleep(1000); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
    System.out.println(answer[0]); //return "value assigned from the thread"